@rubix0270/arboris 1.0.1 → 1.0.3

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 (451) hide show
  1. package/package.json +8 -19
  2. package/run.mjs +10 -0
  3. package/dist/cli.mjs +0 -382
  4. package/manifest.json +0 -323
  5. package/prisma/skills/accessibility/SKILL.md +0 -147
  6. package/prisma/skills/agent-architecture-audit/SKILL.md +0 -257
  7. package/prisma/skills/agent-eval/SKILL.md +0 -146
  8. package/prisma/skills/agent-harness-construction/SKILL.md +0 -74
  9. package/prisma/skills/agent-introspection-debugging/SKILL.md +0 -154
  10. package/prisma/skills/agent-payment-x402/SKILL.md +0 -225
  11. package/prisma/skills/agent-self-evaluation/SKILL.md +0 -182
  12. package/prisma/skills/agent-self-evaluation/examples/high-score-example.md +0 -87
  13. package/prisma/skills/agent-self-evaluation/examples/low-score-example.md +0 -86
  14. package/prisma/skills/agent-self-evaluation/references/evaluation-criteria.md +0 -71
  15. package/prisma/skills/agent-self-evaluation/references/hook-integration.md +0 -64
  16. package/prisma/skills/agent-self-evaluation/scripts/evaluate.py +0 -408
  17. package/prisma/skills/agent-self-evaluation/templates/evaluation-report.md +0 -86
  18. package/prisma/skills/agent-sort/SKILL.md +0 -216
  19. package/prisma/skills/agentic-engineering/SKILL.md +0 -64
  20. package/prisma/skills/agentic-os/SKILL.md +0 -388
  21. package/prisma/skills/ai-first-engineering/SKILL.md +0 -52
  22. package/prisma/skills/ai-regression-testing/SKILL.md +0 -386
  23. package/prisma/skills/android-clean-architecture/SKILL.md +0 -340
  24. package/prisma/skills/angular-developer/SKILL.md +0 -155
  25. package/prisma/skills/angular-developer/references/angular-animations.md +0 -160
  26. package/prisma/skills/angular-developer/references/angular-aria.md +0 -410
  27. package/prisma/skills/angular-developer/references/cli.md +0 -86
  28. package/prisma/skills/angular-developer/references/component-harnesses.md +0 -59
  29. package/prisma/skills/angular-developer/references/component-styling.md +0 -91
  30. package/prisma/skills/angular-developer/references/components.md +0 -117
  31. package/prisma/skills/angular-developer/references/creating-services.md +0 -97
  32. package/prisma/skills/angular-developer/references/data-resolvers.md +0 -69
  33. package/prisma/skills/angular-developer/references/define-routes.md +0 -67
  34. package/prisma/skills/angular-developer/references/defining-providers.md +0 -72
  35. package/prisma/skills/angular-developer/references/di-fundamentals.md +0 -120
  36. package/prisma/skills/angular-developer/references/e2e-testing.md +0 -56
  37. package/prisma/skills/angular-developer/references/effects.md +0 -83
  38. package/prisma/skills/angular-developer/references/hierarchical-injectors.md +0 -43
  39. package/prisma/skills/angular-developer/references/host-elements.md +0 -80
  40. package/prisma/skills/angular-developer/references/injection-context.md +0 -63
  41. package/prisma/skills/angular-developer/references/inputs.md +0 -101
  42. package/prisma/skills/angular-developer/references/linked-signal.md +0 -59
  43. package/prisma/skills/angular-developer/references/loading-strategies.md +0 -61
  44. package/prisma/skills/angular-developer/references/mcp.md +0 -108
  45. package/prisma/skills/angular-developer/references/navigate-to-routes.md +0 -69
  46. package/prisma/skills/angular-developer/references/outputs.md +0 -86
  47. package/prisma/skills/angular-developer/references/reactive-forms.md +0 -122
  48. package/prisma/skills/angular-developer/references/rendering-strategies.md +0 -44
  49. package/prisma/skills/angular-developer/references/resource.md +0 -77
  50. package/prisma/skills/angular-developer/references/route-animations.md +0 -56
  51. package/prisma/skills/angular-developer/references/route-guards.md +0 -52
  52. package/prisma/skills/angular-developer/references/router-lifecycle.md +0 -45
  53. package/prisma/skills/angular-developer/references/router-testing.md +0 -87
  54. package/prisma/skills/angular-developer/references/show-routes-with-outlets.md +0 -68
  55. package/prisma/skills/angular-developer/references/signal-forms.md +0 -795
  56. package/prisma/skills/angular-developer/references/signals-overview.md +0 -94
  57. package/prisma/skills/angular-developer/references/tailwind-css.md +0 -69
  58. package/prisma/skills/angular-developer/references/template-driven-forms.md +0 -114
  59. package/prisma/skills/angular-developer/references/testing-fundamentals.md +0 -65
  60. package/prisma/skills/api-connector-builder/SKILL.md +0 -121
  61. package/prisma/skills/api-design/SKILL.md +0 -524
  62. package/prisma/skills/architecture-decision-records/SKILL.md +0 -180
  63. package/prisma/skills/article-writing/SKILL.md +0 -80
  64. package/prisma/skills/automation-audit-ops/SKILL.md +0 -143
  65. package/prisma/skills/autonomous-agent-harness/SKILL.md +0 -274
  66. package/prisma/skills/autonomous-loops/SKILL.md +0 -611
  67. package/prisma/skills/backend-patterns/SKILL.md +0 -562
  68. package/prisma/skills/benchmark/SKILL.md +0 -94
  69. package/prisma/skills/benchmark-methodology/SKILL.md +0 -190
  70. package/prisma/skills/benchmark-optimization-loop/SKILL.md +0 -70
  71. package/prisma/skills/blender-motion-state-inspection/SKILL.md +0 -165
  72. package/prisma/skills/blueprint/SKILL.md +0 -106
  73. package/prisma/skills/brand-discovery/SKILL.md +0 -145
  74. package/prisma/skills/brand-discovery/references/10_purpose-why.md +0 -40
  75. package/prisma/skills/brand-discovery/references/20_positioning.md +0 -44
  76. package/prisma/skills/brand-discovery/references/30_audience-niche.md +0 -52
  77. package/prisma/skills/brand-discovery/references/40_personality-archetype.md +0 -57
  78. package/prisma/skills/brand-discovery/references/50_voice-tone.md +0 -59
  79. package/prisma/skills/brand-discovery/references/60_narrative-story.md +0 -50
  80. package/prisma/skills/brand-discovery/references/70_founder-tension.md +0 -49
  81. package/prisma/skills/brand-discovery/references/90_SYNTHESIS.md +0 -133
  82. package/prisma/skills/brand-voice/SKILL.md +0 -98
  83. package/prisma/skills/brand-voice/references/voice-profile-schema.md +0 -55
  84. package/prisma/skills/browser-qa/SKILL.md +0 -105
  85. package/prisma/skills/bun-runtime/SKILL.md +0 -85
  86. package/prisma/skills/canary-watch/SKILL.md +0 -108
  87. package/prisma/skills/carrier-relationship-management/SKILL.md +0 -212
  88. package/prisma/skills/cisco-ios-patterns/SKILL.md +0 -164
  89. package/prisma/skills/ck/SKILL.md +0 -148
  90. package/prisma/skills/ck/commands/forget.mjs +0 -44
  91. package/prisma/skills/ck/commands/info.mjs +0 -24
  92. package/prisma/skills/ck/commands/init.mjs +0 -143
  93. package/prisma/skills/ck/commands/list.mjs +0 -40
  94. package/prisma/skills/ck/commands/migrate.mjs +0 -202
  95. package/prisma/skills/ck/commands/resume.mjs +0 -36
  96. package/prisma/skills/ck/commands/save.mjs +0 -210
  97. package/prisma/skills/ck/commands/shared.mjs +0 -387
  98. package/prisma/skills/ck/hooks/session-start.mjs +0 -224
  99. package/prisma/skills/claude-devfleet/SKILL.md +0 -112
  100. package/prisma/skills/click-path-audit/SKILL.md +0 -245
  101. package/prisma/skills/clickhouse-io/SKILL.md +0 -440
  102. package/prisma/skills/code-tour/SKILL.md +0 -254
  103. package/prisma/skills/codebase-onboarding/SKILL.md +0 -234
  104. package/prisma/skills/codehealth-mcp/SKILL.md +0 -167
  105. package/prisma/skills/coding-standards/SKILL.md +0 -551
  106. package/prisma/skills/competitive-platform-analysis/SKILL.md +0 -214
  107. package/prisma/skills/competitive-report-structure/SKILL.md +0 -162
  108. package/prisma/skills/compose-multiplatform-patterns/SKILL.md +0 -300
  109. package/prisma/skills/config-gc/SKILL.md +0 -120
  110. package/prisma/skills/configure-ecc/SKILL.md +0 -385
  111. package/prisma/skills/connections-optimizer/SKILL.md +0 -190
  112. package/prisma/skills/content-engine/SKILL.md +0 -132
  113. package/prisma/skills/content-hash-cache-pattern/SKILL.md +0 -162
  114. package/prisma/skills/context-budget/SKILL.md +0 -136
  115. package/prisma/skills/continuous-agent-loop/SKILL.md +0 -46
  116. package/prisma/skills/continuous-learning/SKILL.md +0 -132
  117. package/prisma/skills/continuous-learning/config.json +0 -18
  118. package/prisma/skills/continuous-learning/evaluate-session.sh +0 -69
  119. package/prisma/skills/continuous-learning-v2/SKILL.md +0 -361
  120. package/prisma/skills/continuous-learning-v2/agents/observer-loop.sh +0 -359
  121. package/prisma/skills/continuous-learning-v2/agents/observer.md +0 -189
  122. package/prisma/skills/continuous-learning-v2/agents/session-guardian.sh +0 -150
  123. package/prisma/skills/continuous-learning-v2/agents/start-observer.sh +0 -248
  124. package/prisma/skills/continuous-learning-v2/config.json +0 -8
  125. package/prisma/skills/continuous-learning-v2/hooks/observe.sh +0 -585
  126. package/prisma/skills/continuous-learning-v2/scripts/detect-project.sh +0 -322
  127. package/prisma/skills/continuous-learning-v2/scripts/instinct-cli.py +0 -1956
  128. package/prisma/skills/continuous-learning-v2/scripts/lib/homunculus-dir.sh +0 -31
  129. package/prisma/skills/continuous-learning-v2/scripts/migrate-homunculus.sh +0 -68
  130. package/prisma/skills/continuous-learning-v2/scripts/test_parse_instinct.py +0 -1421
  131. package/prisma/skills/cost-aware-llm-pipeline/SKILL.md +0 -184
  132. package/prisma/skills/cost-tracking/SKILL.md +0 -97
  133. package/prisma/skills/council/SKILL.md +0 -204
  134. package/prisma/skills/cpp-coding-standards/SKILL.md +0 -724
  135. package/prisma/skills/cpp-testing/SKILL.md +0 -325
  136. package/prisma/skills/crosspost/SKILL.md +0 -112
  137. package/prisma/skills/csharp-testing/SKILL.md +0 -322
  138. package/prisma/skills/customer-billing-ops/SKILL.md +0 -141
  139. package/prisma/skills/customs-trade-compliance/SKILL.md +0 -263
  140. package/prisma/skills/dart-flutter-patterns/SKILL.md +0 -564
  141. package/prisma/skills/dashboard-builder/SKILL.md +0 -109
  142. package/prisma/skills/data-scraper-agent/SKILL.md +0 -765
  143. package/prisma/skills/data-throughput-accelerator/SKILL.md +0 -73
  144. package/prisma/skills/database-migrations/SKILL.md +0 -430
  145. package/prisma/skills/deep-research/SKILL.md +0 -160
  146. package/prisma/skills/defi-amm-security/SKILL.md +0 -167
  147. package/prisma/skills/delivery-gate/SKILL.md +0 -126
  148. package/prisma/skills/delivery-gate/hooks/quality-gate.py +0 -220
  149. package/prisma/skills/deployment-patterns/SKILL.md +0 -428
  150. package/prisma/skills/design-system/SKILL.md +0 -83
  151. package/prisma/skills/django-celery/SKILL.md +0 -458
  152. package/prisma/skills/django-patterns/SKILL.md +0 -735
  153. package/prisma/skills/django-security/SKILL.md +0 -644
  154. package/prisma/skills/django-tdd/SKILL.md +0 -730
  155. package/prisma/skills/django-verification/SKILL.md +0 -470
  156. package/prisma/skills/dmux-workflows/SKILL.md +0 -192
  157. package/prisma/skills/docker-patterns/SKILL.md +0 -365
  158. package/prisma/skills/documentation-lookup/SKILL.md +0 -91
  159. package/prisma/skills/dotnet-patterns/SKILL.md +0 -322
  160. package/prisma/skills/dynamic-workflow-mode/SKILL.md +0 -124
  161. package/prisma/skills/e2e-testing/SKILL.md +0 -327
  162. package/prisma/skills/ecc-guide/SKILL.md +0 -190
  163. package/prisma/skills/ecc-recipes/SKILL.md +0 -149
  164. package/prisma/skills/ecc-tools-cost-audit/SKILL.md +0 -161
  165. package/prisma/skills/email-ops/SKILL.md +0 -122
  166. package/prisma/skills/energy-procurement/SKILL.md +0 -228
  167. package/prisma/skills/enterprise-agent-ops/SKILL.md +0 -51
  168. package/prisma/skills/error-handling/SKILL.md +0 -377
  169. package/prisma/skills/eval-harness/SKILL.md +0 -271
  170. package/prisma/skills/evm-token-decimals/SKILL.md +0 -131
  171. package/prisma/skills/exa-search/SKILL.md +0 -108
  172. package/prisma/skills/fal-ai-media/SKILL.md +0 -289
  173. package/prisma/skills/fastapi-patterns/SKILL.md +0 -514
  174. package/prisma/skills/finance-billing-ops/SKILL.md +0 -128
  175. package/prisma/skills/flox-environments/SKILL.md +0 -497
  176. package/prisma/skills/flutter-dart-code-review/SKILL.md +0 -436
  177. package/prisma/skills/foundation-models-on-device/SKILL.md +0 -243
  178. package/prisma/skills/frontend-a11y/SKILL.md +0 -446
  179. package/prisma/skills/frontend-design-direction/SKILL.md +0 -93
  180. package/prisma/skills/frontend-patterns/SKILL.md +0 -657
  181. package/prisma/skills/frontend-slides/SKILL.md +0 -185
  182. package/prisma/skills/frontend-slides/STYLE_PRESETS.md +0 -330
  183. package/prisma/skills/frontend-slides/animation-patterns.md +0 -122
  184. package/prisma/skills/frontend-slides/html-template.md +0 -419
  185. package/prisma/skills/frontend-slides/scripts/export-pdf.sh +0 -418
  186. package/prisma/skills/frontend-slides/scripts/extract-pptx.py +0 -96
  187. package/prisma/skills/frontend-slides/viewport-base.css +0 -153
  188. package/prisma/skills/fsharp-testing/SKILL.md +0 -281
  189. package/prisma/skills/gan-style-harness/SKILL.md +0 -279
  190. package/prisma/skills/gateguard/SKILL.md +0 -133
  191. package/prisma/skills/generating-python-installer/SKILL.md +0 -820
  192. package/prisma/skills/git-workflow/SKILL.md +0 -716
  193. package/prisma/skills/github-ops/SKILL.md +0 -145
  194. package/prisma/skills/golang-patterns/SKILL.md +0 -675
  195. package/prisma/skills/golang-testing/SKILL.md +0 -721
  196. package/prisma/skills/google-workspace-ops/SKILL.md +0 -96
  197. package/prisma/skills/growth-log/SKILL.md +0 -128
  198. package/prisma/skills/healthcare-cdss-patterns/SKILL.md +0 -246
  199. package/prisma/skills/healthcare-emr-patterns/SKILL.md +0 -160
  200. package/prisma/skills/healthcare-eval-harness/SKILL.md +0 -208
  201. package/prisma/skills/healthcare-phi-compliance/SKILL.md +0 -146
  202. package/prisma/skills/hermes-imports/SKILL.md +0 -89
  203. package/prisma/skills/hexagonal-architecture/SKILL.md +0 -277
  204. package/prisma/skills/hipaa-compliance/SKILL.md +0 -79
  205. package/prisma/skills/homelab-network-readiness/SKILL.md +0 -170
  206. package/prisma/skills/homelab-network-setup/SKILL.md +0 -130
  207. package/prisma/skills/homelab-pihole-dns/SKILL.md +0 -275
  208. package/prisma/skills/homelab-vlan-segmentation/SKILL.md +0 -312
  209. package/prisma/skills/homelab-wireguard-vpn/SKILL.md +0 -306
  210. package/prisma/skills/hookify-rules/SKILL.md +0 -128
  211. package/prisma/skills/inherit-legacy-style/SKILL.md +0 -157
  212. package/prisma/skills/intent-driven-development/SKILL.md +0 -360
  213. package/prisma/skills/inventory-demand-planning/SKILL.md +0 -247
  214. package/prisma/skills/investor-materials/SKILL.md +0 -97
  215. package/prisma/skills/investor-outreach/SKILL.md +0 -92
  216. package/prisma/skills/ios-icon-gen/SKILL.md +0 -158
  217. package/prisma/skills/ios-icon-gen/scripts/generate_icons.swift +0 -258
  218. package/prisma/skills/ios-icon-gen/scripts/iconify_gen.sh +0 -235
  219. package/prisma/skills/iterative-retrieval/SKILL.md +0 -212
  220. package/prisma/skills/ito-basket-compare/SKILL.md +0 -64
  221. package/prisma/skills/ito-data-atlas-agent/SKILL.md +0 -64
  222. package/prisma/skills/ito-market-intelligence/SKILL.md +0 -61
  223. package/prisma/skills/ito-trade-planner/SKILL.md +0 -68
  224. package/prisma/skills/java-coding-standards/SKILL.md +0 -384
  225. package/prisma/skills/jira-integration/SKILL.md +0 -303
  226. package/prisma/skills/jpa-patterns/SKILL.md +0 -152
  227. package/prisma/skills/knowledge-ops/SKILL.md +0 -155
  228. package/prisma/skills/kotlin-coroutines-flows/SKILL.md +0 -285
  229. package/prisma/skills/kotlin-exposed-patterns/SKILL.md +0 -720
  230. package/prisma/skills/kotlin-ktor-patterns/SKILL.md +0 -690
  231. package/prisma/skills/kotlin-patterns/SKILL.md +0 -712
  232. package/prisma/skills/kotlin-testing/SKILL.md +0 -825
  233. package/prisma/skills/kubernetes-patterns/SKILL.md +0 -756
  234. package/prisma/skills/laravel-patterns/SKILL.md +0 -416
  235. package/prisma/skills/laravel-plugin-discovery/SKILL.md +0 -230
  236. package/prisma/skills/laravel-security/SKILL.md +0 -948
  237. package/prisma/skills/laravel-tdd/SKILL.md +0 -675
  238. package/prisma/skills/laravel-verification/SKILL.md +0 -180
  239. package/prisma/skills/latency-critical-systems/SKILL.md +0 -74
  240. package/prisma/skills/lead-intelligence/SKILL.md +0 -322
  241. package/prisma/skills/lead-intelligence/agents/enrichment-agent.md +0 -85
  242. package/prisma/skills/lead-intelligence/agents/mutual-mapper.md +0 -75
  243. package/prisma/skills/lead-intelligence/agents/outreach-drafter.md +0 -98
  244. package/prisma/skills/lead-intelligence/agents/signal-scorer.md +0 -60
  245. package/prisma/skills/liquid-glass-design/SKILL.md +0 -279
  246. package/prisma/skills/llm-trading-agent-security/SKILL.md +0 -147
  247. package/prisma/skills/logistics-exception-management/SKILL.md +0 -222
  248. package/prisma/skills/loop-design-check/SKILL.md +0 -143
  249. package/prisma/skills/mailtrap-email-integration/SKILL.md +0 -77
  250. package/prisma/skills/make-interfaces-feel-better/SKILL.md +0 -152
  251. package/prisma/skills/manim-video/SKILL.md +0 -90
  252. package/prisma/skills/manim-video/assets/network_graph_scene.py +0 -52
  253. package/prisma/skills/market-research/SKILL.md +0 -76
  254. package/prisma/skills/marketing-campaign/SKILL.md +0 -114
  255. package/prisma/skills/mcp-server-patterns/SKILL.md +0 -70
  256. package/prisma/skills/messages-ops/SKILL.md +0 -105
  257. package/prisma/skills/ml-adoption-playbook/SKILL.md +0 -57
  258. package/prisma/skills/mle-workflow/SKILL.md +0 -347
  259. package/prisma/skills/motion-advanced/SKILL.md +0 -596
  260. package/prisma/skills/motion-foundations/SKILL.md +0 -299
  261. package/prisma/skills/motion-patterns/SKILL.md +0 -434
  262. package/prisma/skills/motion-ui/SKILL.md +0 -576
  263. package/prisma/skills/mysql-patterns/SKILL.md +0 -413
  264. package/prisma/skills/nanoclaw-repl/SKILL.md +0 -34
  265. package/prisma/skills/nestjs-patterns/SKILL.md +0 -231
  266. package/prisma/skills/netmiko-ssh-automation/SKILL.md +0 -174
  267. package/prisma/skills/network-bgp-diagnostics/SKILL.md +0 -168
  268. package/prisma/skills/network-config-validation/SKILL.md +0 -211
  269. package/prisma/skills/network-interface-health/SKILL.md +0 -153
  270. package/prisma/skills/nextjs-turbopack/SKILL.md +0 -58
  271. package/prisma/skills/nodejs-keccak256/SKILL.md +0 -103
  272. package/prisma/skills/nutrient-document-processing/SKILL.md +0 -168
  273. package/prisma/skills/nuxt4-patterns/SKILL.md +0 -101
  274. package/prisma/skills/openclaw-persona-forge/SKILL.md +0 -289
  275. package/prisma/skills/openclaw-persona-forge/gacha.py +0 -224
  276. package/prisma/skills/openclaw-persona-forge/gacha.sh +0 -5
  277. package/prisma/skills/openclaw-persona-forge/references/avatar-style.md +0 -124
  278. package/prisma/skills/openclaw-persona-forge/references/boundary-rules.md +0 -53
  279. package/prisma/skills/openclaw-persona-forge/references/error-handling.md +0 -53
  280. package/prisma/skills/openclaw-persona-forge/references/identity-tension.md +0 -48
  281. package/prisma/skills/openclaw-persona-forge/references/naming-system.md +0 -39
  282. package/prisma/skills/openclaw-persona-forge/references/output-template.md +0 -166
  283. package/prisma/skills/opensource-pipeline/SKILL.md +0 -256
  284. package/prisma/skills/orch-add-feature/SKILL.md +0 -45
  285. package/prisma/skills/orch-build-mvp/SKILL.md +0 -49
  286. package/prisma/skills/orch-change-feature/SKILL.md +0 -43
  287. package/prisma/skills/orch-fix-defect/SKILL.md +0 -43
  288. package/prisma/skills/orch-pipeline/SKILL.md +0 -121
  289. package/prisma/skills/orch-refine-code/SKILL.md +0 -44
  290. package/prisma/skills/parallel-execution-optimizer/SKILL.md +0 -73
  291. package/prisma/skills/perl-patterns/SKILL.md +0 -505
  292. package/prisma/skills/perl-security/SKILL.md +0 -504
  293. package/prisma/skills/perl-testing/SKILL.md +0 -476
  294. package/prisma/skills/plan-orchestrate/SKILL.md +0 -263
  295. package/prisma/skills/plankton-code-quality/SKILL.md +0 -237
  296. package/prisma/skills/postgres-patterns/SKILL.md +0 -148
  297. package/prisma/skills/prediction-market-oracle-research/SKILL.md +0 -64
  298. package/prisma/skills/prediction-market-risk-review/SKILL.md +0 -61
  299. package/prisma/skills/prisma-patterns/SKILL.md +0 -401
  300. package/prisma/skills/product-capability/SKILL.md +0 -142
  301. package/prisma/skills/product-lens/SKILL.md +0 -93
  302. package/prisma/skills/production-audit/SKILL.md +0 -207
  303. package/prisma/skills/production-scheduling/SKILL.md +0 -238
  304. package/prisma/skills/project-flow-ops/SKILL.md +0 -112
  305. package/prisma/skills/prompt-optimizer/SKILL.md +0 -398
  306. package/prisma/skills/python-patterns/SKILL.md +0 -751
  307. package/prisma/skills/python-testing/SKILL.md +0 -817
  308. package/prisma/skills/pytorch-patterns/SKILL.md +0 -397
  309. package/prisma/skills/quality-nonconformance/SKILL.md +0 -260
  310. package/prisma/skills/quarkus-patterns/SKILL.md +0 -723
  311. package/prisma/skills/quarkus-security/SKILL.md +0 -468
  312. package/prisma/skills/quarkus-tdd/SKILL.md +0 -812
  313. package/prisma/skills/quarkus-verification/SKILL.md +0 -480
  314. package/prisma/skills/ralphinho-rfc-pipeline/SKILL.md +0 -68
  315. package/prisma/skills/react-native-patterns/SKILL.md +0 -326
  316. package/prisma/skills/react-patterns/SKILL.md +0 -342
  317. package/prisma/skills/react-performance/SKILL.md +0 -575
  318. package/prisma/skills/react-testing/SKILL.md +0 -424
  319. package/prisma/skills/recsys-pipeline-architect/SKILL.md +0 -115
  320. package/prisma/skills/recursive-decision-ledger/SKILL.md +0 -80
  321. package/prisma/skills/redis-patterns/SKILL.md +0 -404
  322. package/prisma/skills/regex-vs-llm-structured-text/SKILL.md +0 -221
  323. package/prisma/skills/remotion-video-creation/SKILL.md +0 -43
  324. package/prisma/skills/remotion-video-creation/rules/3d.md +0 -86
  325. package/prisma/skills/remotion-video-creation/rules/animations.md +0 -29
  326. package/prisma/skills/remotion-video-creation/rules/assets/charts-bar-chart.tsx +0 -173
  327. package/prisma/skills/remotion-video-creation/rules/assets/text-animations-typewriter.tsx +0 -100
  328. package/prisma/skills/remotion-video-creation/rules/assets/text-animations-word-highlight.tsx +0 -108
  329. package/prisma/skills/remotion-video-creation/rules/assets.md +0 -78
  330. package/prisma/skills/remotion-video-creation/rules/audio.md +0 -172
  331. package/prisma/skills/remotion-video-creation/rules/calculate-metadata.md +0 -104
  332. package/prisma/skills/remotion-video-creation/rules/can-decode.md +0 -75
  333. package/prisma/skills/remotion-video-creation/rules/charts.md +0 -58
  334. package/prisma/skills/remotion-video-creation/rules/compositions.md +0 -146
  335. package/prisma/skills/remotion-video-creation/rules/display-captions.md +0 -126
  336. package/prisma/skills/remotion-video-creation/rules/extract-frames.md +0 -229
  337. package/prisma/skills/remotion-video-creation/rules/fonts.md +0 -152
  338. package/prisma/skills/remotion-video-creation/rules/get-audio-duration.md +0 -58
  339. package/prisma/skills/remotion-video-creation/rules/get-video-dimensions.md +0 -68
  340. package/prisma/skills/remotion-video-creation/rules/get-video-duration.md +0 -58
  341. package/prisma/skills/remotion-video-creation/rules/gifs.md +0 -138
  342. package/prisma/skills/remotion-video-creation/rules/images.md +0 -130
  343. package/prisma/skills/remotion-video-creation/rules/import-srt-captions.md +0 -67
  344. package/prisma/skills/remotion-video-creation/rules/lottie.md +0 -67
  345. package/prisma/skills/remotion-video-creation/rules/measuring-dom-nodes.md +0 -34
  346. package/prisma/skills/remotion-video-creation/rules/measuring-text.md +0 -143
  347. package/prisma/skills/remotion-video-creation/rules/sequencing.md +0 -106
  348. package/prisma/skills/remotion-video-creation/rules/tailwind.md +0 -11
  349. package/prisma/skills/remotion-video-creation/rules/text-animations.md +0 -20
  350. package/prisma/skills/remotion-video-creation/rules/timing.md +0 -179
  351. package/prisma/skills/remotion-video-creation/rules/transcribe-captions.md +0 -19
  352. package/prisma/skills/remotion-video-creation/rules/transitions.md +0 -122
  353. package/prisma/skills/remotion-video-creation/rules/trimming.md +0 -52
  354. package/prisma/skills/remotion-video-creation/rules/videos.md +0 -171
  355. package/prisma/skills/repo-scan/SKILL.md +0 -79
  356. package/prisma/skills/research-ops/SKILL.md +0 -113
  357. package/prisma/skills/returns-reverse-logistics/SKILL.md +0 -240
  358. package/prisma/skills/rules-distill/SKILL.md +0 -265
  359. package/prisma/skills/rules-distill/scripts/scan-rules.sh +0 -58
  360. package/prisma/skills/rules-distill/scripts/scan-skills.sh +0 -129
  361. package/prisma/skills/rust-patterns/SKILL.md +0 -500
  362. package/prisma/skills/rust-testing/SKILL.md +0 -501
  363. package/prisma/skills/safety-guard/SKILL.md +0 -76
  364. package/prisma/skills/santa-method/SKILL.md +0 -307
  365. package/prisma/skills/scientific-db-pubmed-database/SKILL.md +0 -176
  366. package/prisma/skills/scientific-db-uspto-database/SKILL.md +0 -178
  367. package/prisma/skills/scientific-pkg-gget/SKILL.md +0 -167
  368. package/prisma/skills/scientific-thinking-literature-review/SKILL.md +0 -193
  369. package/prisma/skills/scientific-thinking-scholar-evaluation/SKILL.md +0 -161
  370. package/prisma/skills/search-first/SKILL.md +0 -183
  371. package/prisma/skills/security-bounty-hunter/SKILL.md +0 -100
  372. package/prisma/skills/security-review/SKILL.md +0 -504
  373. package/prisma/skills/security-review/cloud-infrastructure-security.md +0 -361
  374. package/prisma/skills/security-scan/SKILL.md +0 -166
  375. package/prisma/skills/seo/SKILL.md +0 -155
  376. package/prisma/skills/skill-comply/SKILL.md +0 -59
  377. package/prisma/skills/skill-comply/fixtures/compliant_trace.jsonl +0 -5
  378. package/prisma/skills/skill-comply/fixtures/noncompliant_trace.jsonl +0 -3
  379. package/prisma/skills/skill-comply/fixtures/tdd_spec.yaml +0 -44
  380. package/prisma/skills/skill-comply/prompts/classifier.md +0 -24
  381. package/prisma/skills/skill-comply/prompts/scenario_generator.md +0 -62
  382. package/prisma/skills/skill-comply/prompts/spec_generator.md +0 -42
  383. package/prisma/skills/skill-comply/pyproject.toml +0 -15
  384. package/prisma/skills/skill-comply/scripts/__init__.py +0 -0
  385. package/prisma/skills/skill-comply/scripts/classifier.py +0 -85
  386. package/prisma/skills/skill-comply/scripts/grader.py +0 -124
  387. package/prisma/skills/skill-comply/scripts/parser.py +0 -107
  388. package/prisma/skills/skill-comply/scripts/report.py +0 -170
  389. package/prisma/skills/skill-comply/scripts/run.py +0 -127
  390. package/prisma/skills/skill-comply/scripts/runner.py +0 -194
  391. package/prisma/skills/skill-comply/scripts/scenario_generator.py +0 -70
  392. package/prisma/skills/skill-comply/scripts/spec_generator.py +0 -72
  393. package/prisma/skills/skill-comply/scripts/utils.py +0 -13
  394. package/prisma/skills/skill-comply/tests/test_grader.py +0 -197
  395. package/prisma/skills/skill-comply/tests/test_parser.py +0 -90
  396. package/prisma/skills/skill-comply/tests/test_runner.py +0 -172
  397. package/prisma/skills/skill-scout/SKILL.md +0 -141
  398. package/prisma/skills/skill-stocktake/SKILL.md +0 -195
  399. package/prisma/skills/skill-stocktake/scripts/quick-diff.sh +0 -87
  400. package/prisma/skills/skill-stocktake/scripts/save-results.sh +0 -56
  401. package/prisma/skills/skill-stocktake/scripts/scan.sh +0 -170
  402. package/prisma/skills/social-graph-ranker/SKILL.md +0 -155
  403. package/prisma/skills/social-publisher/SKILL.md +0 -130
  404. package/prisma/skills/springboot-patterns/SKILL.md +0 -315
  405. package/prisma/skills/springboot-security/SKILL.md +0 -273
  406. package/prisma/skills/springboot-tdd/SKILL.md +0 -159
  407. package/prisma/skills/springboot-verification/SKILL.md +0 -232
  408. package/prisma/skills/strategic-compact/SKILL.md +0 -136
  409. package/prisma/skills/swift-actor-persistence/SKILL.md +0 -144
  410. package/prisma/skills/swift-concurrency-6-2/SKILL.md +0 -216
  411. package/prisma/skills/swift-protocol-di-testing/SKILL.md +0 -191
  412. package/prisma/skills/swiftui-patterns/SKILL.md +0 -259
  413. package/prisma/skills/taste/SKILL.md +0 -264
  414. package/prisma/skills/taste/references/genre-taxonomy.md +0 -87
  415. package/prisma/skills/tdd-workflow/SKILL.md +0 -583
  416. package/prisma/skills/team-agent-orchestration/SKILL.md +0 -111
  417. package/prisma/skills/team-builder/SKILL.md +0 -169
  418. package/prisma/skills/terminal-ops/SKILL.md +0 -110
  419. package/prisma/skills/tinystruct-patterns/SKILL.md +0 -279
  420. package/prisma/skills/tinystruct-patterns/references/architecture.md +0 -90
  421. package/prisma/skills/tinystruct-patterns/references/data-handling.md +0 -60
  422. package/prisma/skills/tinystruct-patterns/references/database.md +0 -99
  423. package/prisma/skills/tinystruct-patterns/references/routing.md +0 -64
  424. package/prisma/skills/tinystruct-patterns/references/system-usage.md +0 -97
  425. package/prisma/skills/tinystruct-patterns/references/testing.md +0 -72
  426. package/prisma/skills/token-budget-advisor/SKILL.md +0 -134
  427. package/prisma/skills/ui-demo/SKILL.md +0 -466
  428. package/prisma/skills/ui-to-vue/SKILL.md +0 -135
  429. package/prisma/skills/uncloud/SKILL.md +0 -344
  430. package/prisma/skills/unified-notifications-ops/SKILL.md +0 -188
  431. package/prisma/skills/verification-loop/SKILL.md +0 -127
  432. package/prisma/skills/video-editing/SKILL.md +0 -311
  433. package/prisma/skills/videodb/SKILL.md +0 -375
  434. package/prisma/skills/videodb/reference/api-reference.md +0 -550
  435. package/prisma/skills/videodb/reference/capture-reference.md +0 -407
  436. package/prisma/skills/videodb/reference/capture.md +0 -101
  437. package/prisma/skills/videodb/reference/editor.md +0 -443
  438. package/prisma/skills/videodb/reference/generative.md +0 -331
  439. package/prisma/skills/videodb/reference/rtstream-reference.md +0 -564
  440. package/prisma/skills/videodb/reference/rtstream.md +0 -65
  441. package/prisma/skills/videodb/reference/search.md +0 -230
  442. package/prisma/skills/videodb/reference/streaming.md +0 -406
  443. package/prisma/skills/videodb/reference/use-cases.md +0 -118
  444. package/prisma/skills/videodb/scripts/ws_listener.py +0 -282
  445. package/prisma/skills/visa-doc-translate/README.md +0 -86
  446. package/prisma/skills/visa-doc-translate/SKILL.md +0 -117
  447. package/prisma/skills/vite-patterns/SKILL.md +0 -450
  448. package/prisma/skills/vue-patterns/SKILL.md +0 -471
  449. package/prisma/skills/windows-desktop-e2e/SKILL.md +0 -888
  450. package/prisma/skills/workspace-surface-audit/SKILL.md +0 -126
  451. package/prisma/skills/x-api/SKILL.md +0 -235
@@ -1,170 +0,0 @@
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
@@ -1,127 +0,0 @@
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()
@@ -1,194 +0,0 @@
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
- ALLOWED_SETUP_EXECUTABLES = frozenset({
19
- "git", "npm", "pip", "pip3",
20
- "touch", "mkdir", "cp", "mv", "echo",
21
- "chmod", "unzip", "tar",
22
- })
23
- # Shell builtins cannot be invoked via subprocess.run; cwd is already
24
- # controlled by the cwd= keyword. Scenarios that include these in
25
- # setup_commands (a common shell-style convention) must be tolerated.
26
- SHELL_BUILTINS = frozenset({"cd", "pushd", "popd"})
27
-
28
-
29
- @dataclass(frozen=True)
30
- class ScenarioRun:
31
- scenario: Scenario
32
- observations: tuple[ObservationEvent, ...]
33
- sandbox_dir: Path
34
-
35
-
36
- def run_scenario(
37
- scenario: Scenario,
38
- model: str = "sonnet",
39
- max_turns: int = 30,
40
- timeout: int = 300,
41
- ) -> ScenarioRun:
42
- """Execute a scenario and extract tool calls from stream-json output."""
43
- if model not in ALLOWED_MODELS:
44
- raise ValueError(f"Unknown model: {model!r}. Allowed: {ALLOWED_MODELS}")
45
-
46
- sandbox_dir = _safe_sandbox_dir(scenario.id)
47
- _setup_sandbox(sandbox_dir, scenario)
48
-
49
- result = subprocess.run(
50
- [
51
- "claude", "-p", scenario.prompt,
52
- "--model", model,
53
- "--max-turns", str(max_turns),
54
- "--add-dir", str(sandbox_dir),
55
- "--allowedTools", "Read,Write,Edit,Bash,Glob,Grep",
56
- "--output-format", "stream-json",
57
- "--verbose",
58
- ],
59
- capture_output=True,
60
- text=True,
61
- timeout=timeout,
62
- cwd=sandbox_dir,
63
- )
64
-
65
- # claude -p returns rc=1 when --max-turns is reached, but the stream-json
66
- # output is still complete and parseable. Treat this graceful termination
67
- # as non-fatal so scenarios that hit the turn cap still produce usable
68
- # observations.
69
- nonfatal_max_turns = (
70
- result.returncode == 1
71
- and '"terminal_reason":"max_turns"' in result.stdout
72
- )
73
- if result.returncode != 0 and not nonfatal_max_turns:
74
- # Include both stderr and stdout tails. claude -p often surfaces the
75
- # actual failure context (model error JSON, partial stream-json) on
76
- # stdout, while stderr carries generic transport / auth messages.
77
- # Showing both dramatically reduces "rc=N: <empty>" debugging dead-ends.
78
- raise RuntimeError(
79
- f"claude -p failed (rc={result.returncode}): "
80
- f"stderr={result.stderr[:500]!r} stdout_tail={result.stdout[-500:]!r}"
81
- )
82
-
83
- observations = _parse_stream_json(result.stdout)
84
-
85
- return ScenarioRun(
86
- scenario=scenario,
87
- observations=tuple(observations),
88
- sandbox_dir=sandbox_dir,
89
- )
90
-
91
-
92
- def _safe_sandbox_dir(scenario_id: str) -> Path:
93
- """Sanitize scenario ID and ensure path stays within sandbox base."""
94
- safe_id = re.sub(r"[^a-zA-Z0-9\-_]", "_", scenario_id)
95
- path = SANDBOX_BASE / safe_id
96
- # Validate path stays within sandbox base (raises ValueError on traversal)
97
- path.resolve().relative_to(SANDBOX_BASE.resolve())
98
- return path
99
-
100
-
101
- def _setup_sandbox(sandbox_dir: Path, scenario: Scenario) -> None:
102
- """Create sandbox directory and run setup commands."""
103
- if sandbox_dir.exists():
104
- shutil.rmtree(sandbox_dir)
105
- sandbox_dir.mkdir(parents=True)
106
-
107
- subprocess.run(["git", "init"], cwd=sandbox_dir, capture_output=True)
108
-
109
- for cmd in scenario.setup_commands:
110
- parts = shlex.split(cmd)
111
- if not parts or parts[0] in SHELL_BUILTINS:
112
- # Shell builtins (cd/pushd/popd) cannot run as subprocess; skip.
113
- continue
114
- if parts[0] not in ALLOWED_SETUP_EXECUTABLES:
115
- # Restrict to known-safe executables to prevent arbitrary code execution.
116
- continue
117
- try:
118
- subprocess.run(parts, cwd=sandbox_dir, capture_output=True)
119
- except FileNotFoundError:
120
- # Setup tool not installed in this environment; skip rather than
121
- # crash the whole scenario. The compliance run continues.
122
- continue
123
-
124
-
125
- def _parse_stream_json(stdout: str) -> list[ObservationEvent]:
126
- """Parse claude -p stream-json output into ObservationEvents.
127
-
128
- Stream-json format:
129
- - type=assistant with content[].type=tool_use → tool call (name, input)
130
- - type=user with content[].type=tool_result → tool result (output)
131
- """
132
- events: list[ObservationEvent] = []
133
- pending: dict[str, dict] = {}
134
- event_counter = 0
135
-
136
- for line in stdout.strip().splitlines():
137
- try:
138
- msg = json.loads(line)
139
- except json.JSONDecodeError:
140
- continue
141
-
142
- msg_type = msg.get("type")
143
-
144
- if msg_type == "assistant":
145
- content = msg.get("message", {}).get("content", [])
146
- for block in content:
147
- if block.get("type") == "tool_use":
148
- tool_use_id = block.get("id", "")
149
- tool_input = block.get("input", {})
150
- input_str = (
151
- json.dumps(tool_input)[:5000]
152
- if isinstance(tool_input, dict)
153
- else str(tool_input)[:5000]
154
- )
155
- pending[tool_use_id] = {
156
- "tool": block.get("name", "unknown"),
157
- "input": input_str,
158
- "order": event_counter,
159
- }
160
- event_counter += 1
161
-
162
- elif msg_type == "user":
163
- content = msg.get("message", {}).get("content", [])
164
- if isinstance(content, list):
165
- for block in content:
166
- tool_use_id = block.get("tool_use_id", "")
167
- if tool_use_id in pending:
168
- info = pending.pop(tool_use_id)
169
- output_content = block.get("content", "")
170
- if isinstance(output_content, list):
171
- output_str = json.dumps(output_content)[:5000]
172
- else:
173
- output_str = str(output_content)[:5000]
174
-
175
- events.append(ObservationEvent(
176
- timestamp=f"T{info['order']:04d}",
177
- event="tool_complete",
178
- tool=info["tool"],
179
- session=msg.get("session_id", "unknown"),
180
- input=info["input"],
181
- output=output_str,
182
- ))
183
-
184
- for _tool_use_id, info in pending.items():
185
- events.append(ObservationEvent(
186
- timestamp=f"T{info['order']:04d}",
187
- event="tool_complete",
188
- tool=info["tool"],
189
- session="unknown",
190
- input=info["input"],
191
- output="",
192
- ))
193
-
194
- return sorted(events, key=lambda e: e.timestamp)
@@ -1,70 +0,0 @@
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)
@@ -1,72 +0,0 @@
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")
@@ -1,13 +0,0 @@
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)