claudecode-omc 5.5.2 → 5.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (433) hide show
  1. package/README.md +63 -0
  2. package/bundled/manifest.json +3 -2
  3. package/bundled/upstream/ecc/.omc-source/bundle.json +23 -0
  4. package/bundled/upstream/ecc/.omc-source/last-plan-apply.json +439 -0
  5. package/bundled/upstream/ecc/.omc-source/manifests/.claude-plugin/marketplace.json +47 -0
  6. package/bundled/upstream/ecc/agents/a11y-architect.md +141 -0
  7. package/bundled/upstream/ecc/agents/architect.md +211 -0
  8. package/bundled/upstream/ecc/agents/build-error-resolver.md +114 -0
  9. package/bundled/upstream/ecc/agents/chief-of-staff.md +151 -0
  10. package/bundled/upstream/ecc/agents/code-architect.md +71 -0
  11. package/bundled/upstream/ecc/agents/code-explorer.md +69 -0
  12. package/bundled/upstream/ecc/agents/code-reviewer.md +237 -0
  13. package/bundled/upstream/ecc/agents/code-simplifier.md +47 -0
  14. package/bundled/upstream/ecc/agents/comment-analyzer.md +45 -0
  15. package/bundled/upstream/ecc/agents/conversation-analyzer.md +52 -0
  16. package/bundled/upstream/ecc/agents/cpp-build-resolver.md +90 -0
  17. package/bundled/upstream/ecc/agents/cpp-reviewer.md +72 -0
  18. package/bundled/upstream/ecc/agents/csharp-reviewer.md +101 -0
  19. package/bundled/upstream/ecc/agents/dart-build-resolver.md +201 -0
  20. package/bundled/upstream/ecc/agents/database-reviewer.md +91 -0
  21. package/bundled/upstream/ecc/agents/doc-updater.md +107 -0
  22. package/bundled/upstream/ecc/agents/docs-lookup.md +68 -0
  23. package/bundled/upstream/ecc/agents/e2e-runner.md +107 -0
  24. package/bundled/upstream/ecc/agents/flutter-reviewer.md +243 -0
  25. package/bundled/upstream/ecc/agents/gan-evaluator.md +209 -0
  26. package/bundled/upstream/ecc/agents/gan-generator.md +131 -0
  27. package/bundled/upstream/ecc/agents/gan-planner.md +99 -0
  28. package/bundled/upstream/ecc/agents/go-build-resolver.md +94 -0
  29. package/bundled/upstream/ecc/agents/go-reviewer.md +76 -0
  30. package/bundled/upstream/ecc/agents/harness-optimizer.md +35 -0
  31. package/bundled/upstream/ecc/agents/healthcare-reviewer.md +83 -0
  32. package/bundled/upstream/ecc/agents/java-build-resolver.md +153 -0
  33. package/bundled/upstream/ecc/agents/java-reviewer.md +92 -0
  34. package/bundled/upstream/ecc/agents/kotlin-build-resolver.md +118 -0
  35. package/bundled/upstream/ecc/agents/kotlin-reviewer.md +159 -0
  36. package/bundled/upstream/ecc/agents/loop-operator.md +36 -0
  37. package/bundled/upstream/ecc/agents/opensource-forker.md +198 -0
  38. package/bundled/upstream/ecc/agents/opensource-packager.md +249 -0
  39. package/bundled/upstream/ecc/agents/opensource-sanitizer.md +188 -0
  40. package/bundled/upstream/ecc/agents/performance-optimizer.md +446 -0
  41. package/bundled/upstream/ecc/agents/planner.md +212 -0
  42. package/bundled/upstream/ecc/agents/pr-test-analyzer.md +45 -0
  43. package/bundled/upstream/ecc/agents/python-reviewer.md +98 -0
  44. package/bundled/upstream/ecc/agents/pytorch-build-resolver.md +120 -0
  45. package/bundled/upstream/ecc/agents/refactor-cleaner.md +85 -0
  46. package/bundled/upstream/ecc/agents/rust-build-resolver.md +148 -0
  47. package/bundled/upstream/ecc/agents/rust-reviewer.md +94 -0
  48. package/bundled/upstream/ecc/agents/security-reviewer.md +108 -0
  49. package/bundled/upstream/ecc/agents/seo-specialist.md +62 -0
  50. package/bundled/upstream/ecc/agents/silent-failure-hunter.md +50 -0
  51. package/bundled/upstream/ecc/agents/tdd-guide.md +91 -0
  52. package/bundled/upstream/ecc/agents/type-design-analyzer.md +41 -0
  53. package/bundled/upstream/ecc/agents/typescript-reviewer.md +112 -0
  54. package/bundled/upstream/ecc/commands/agent-sort.md +23 -0
  55. package/bundled/upstream/ecc/commands/aside.md +164 -0
  56. package/bundled/upstream/ecc/commands/build-fix.md +62 -0
  57. package/bundled/upstream/ecc/commands/checkpoint.md +74 -0
  58. package/bundled/upstream/ecc/commands/claw.md +23 -0
  59. package/bundled/upstream/ecc/commands/code-review.md +289 -0
  60. package/bundled/upstream/ecc/commands/context-budget.md +23 -0
  61. package/bundled/upstream/ecc/commands/cpp-build.md +173 -0
  62. package/bundled/upstream/ecc/commands/cpp-review.md +132 -0
  63. package/bundled/upstream/ecc/commands/cpp-test.md +251 -0
  64. package/bundled/upstream/ecc/commands/devfleet.md +23 -0
  65. package/bundled/upstream/ecc/commands/docs.md +23 -0
  66. package/bundled/upstream/ecc/commands/e2e.md +268 -0
  67. package/bundled/upstream/ecc/commands/eval.md +23 -0
  68. package/bundled/upstream/ecc/commands/evolve.md +178 -0
  69. package/bundled/upstream/ecc/commands/feature-dev.md +49 -0
  70. package/bundled/upstream/ecc/commands/flutter-build.md +164 -0
  71. package/bundled/upstream/ecc/commands/flutter-review.md +116 -0
  72. package/bundled/upstream/ecc/commands/flutter-test.md +144 -0
  73. package/bundled/upstream/ecc/commands/gan-build.md +99 -0
  74. package/bundled/upstream/ecc/commands/gan-design.md +35 -0
  75. package/bundled/upstream/ecc/commands/go-build.md +183 -0
  76. package/bundled/upstream/ecc/commands/go-review.md +148 -0
  77. package/bundled/upstream/ecc/commands/go-test.md +268 -0
  78. package/bundled/upstream/ecc/commands/gradle-build.md +70 -0
  79. package/bundled/upstream/ecc/commands/harness-audit.md +73 -0
  80. package/bundled/upstream/ecc/commands/hookify-configure.md +14 -0
  81. package/bundled/upstream/ecc/commands/hookify-help.md +46 -0
  82. package/bundled/upstream/ecc/commands/hookify-list.md +21 -0
  83. package/bundled/upstream/ecc/commands/hookify.md +50 -0
  84. package/bundled/upstream/ecc/commands/instinct-export.md +66 -0
  85. package/bundled/upstream/ecc/commands/instinct-import.md +114 -0
  86. package/bundled/upstream/ecc/commands/instinct-status.md +59 -0
  87. package/bundled/upstream/ecc/commands/jira.md +106 -0
  88. package/bundled/upstream/ecc/commands/kotlin-build.md +174 -0
  89. package/bundled/upstream/ecc/commands/kotlin-review.md +140 -0
  90. package/bundled/upstream/ecc/commands/kotlin-test.md +312 -0
  91. package/bundled/upstream/ecc/commands/learn-eval.md +116 -0
  92. package/bundled/upstream/ecc/commands/learn.md +70 -0
  93. package/bundled/upstream/ecc/commands/loop-start.md +32 -0
  94. package/bundled/upstream/ecc/commands/loop-status.md +24 -0
  95. package/bundled/upstream/ecc/commands/model-route.md +26 -0
  96. package/bundled/upstream/ecc/commands/multi-backend.md +158 -0
  97. package/bundled/upstream/ecc/commands/multi-execute.md +315 -0
  98. package/bundled/upstream/ecc/commands/multi-frontend.md +158 -0
  99. package/bundled/upstream/ecc/commands/multi-plan.md +268 -0
  100. package/bundled/upstream/ecc/commands/multi-workflow.md +191 -0
  101. package/bundled/upstream/ecc/commands/orchestrate.md +135 -0
  102. package/bundled/upstream/ecc/commands/plan.md +117 -0
  103. package/bundled/upstream/ecc/commands/pm2.md +272 -0
  104. package/bundled/upstream/ecc/commands/projects.md +39 -0
  105. package/bundled/upstream/ecc/commands/promote.md +41 -0
  106. package/bundled/upstream/ecc/commands/prompt-optimize.md +23 -0
  107. package/bundled/upstream/ecc/commands/prp-commit.md +112 -0
  108. package/bundled/upstream/ecc/commands/prp-implement.md +385 -0
  109. package/bundled/upstream/ecc/commands/prp-plan.md +502 -0
  110. package/bundled/upstream/ecc/commands/prp-pr.md +184 -0
  111. package/bundled/upstream/ecc/commands/prp-prd.md +447 -0
  112. package/bundled/upstream/ecc/commands/prune.md +31 -0
  113. package/bundled/upstream/ecc/commands/python-review.md +297 -0
  114. package/bundled/upstream/ecc/commands/quality-gate.md +29 -0
  115. package/bundled/upstream/ecc/commands/refactor-clean.md +80 -0
  116. package/bundled/upstream/ecc/commands/resume-session.md +156 -0
  117. package/bundled/upstream/ecc/commands/review-pr.md +37 -0
  118. package/bundled/upstream/ecc/commands/rules-distill.md +20 -0
  119. package/bundled/upstream/ecc/commands/rust-build.md +187 -0
  120. package/bundled/upstream/ecc/commands/rust-review.md +142 -0
  121. package/bundled/upstream/ecc/commands/rust-test.md +308 -0
  122. package/bundled/upstream/ecc/commands/santa-loop.md +175 -0
  123. package/bundled/upstream/ecc/commands/save-session.md +275 -0
  124. package/bundled/upstream/ecc/commands/sessions.md +339 -0
  125. package/bundled/upstream/ecc/commands/setup-pm.md +80 -0
  126. package/bundled/upstream/ecc/commands/skill-create.md +174 -0
  127. package/bundled/upstream/ecc/commands/skill-health.md +54 -0
  128. package/bundled/upstream/ecc/commands/tdd.md +231 -0
  129. package/bundled/upstream/ecc/commands/test-coverage.md +69 -0
  130. package/bundled/upstream/ecc/commands/update-codemaps.md +72 -0
  131. package/bundled/upstream/ecc/commands/update-docs.md +84 -0
  132. package/bundled/upstream/ecc/commands/verify.md +23 -0
  133. package/bundled/upstream/ecc/hooks/README.md +237 -0
  134. package/bundled/upstream/ecc/hooks/hooks.json +330 -0
  135. package/bundled/upstream/ecc/skills/accessibility/SKILL.md +146 -0
  136. package/bundled/upstream/ecc/skills/agent-eval/SKILL.md +145 -0
  137. package/bundled/upstream/ecc/skills/agent-harness-construction/SKILL.md +73 -0
  138. package/bundled/upstream/ecc/skills/agent-introspection-debugging/SKILL.md +153 -0
  139. package/bundled/upstream/ecc/skills/agent-payment-x402/SKILL.md +178 -0
  140. package/bundled/upstream/ecc/skills/agent-sort/SKILL.md +215 -0
  141. package/bundled/upstream/ecc/skills/agentic-engineering/SKILL.md +63 -0
  142. package/bundled/upstream/ecc/skills/ai-first-engineering/SKILL.md +51 -0
  143. package/bundled/upstream/ecc/skills/ai-regression-testing/SKILL.md +385 -0
  144. package/bundled/upstream/ecc/skills/android-clean-architecture/SKILL.md +339 -0
  145. package/bundled/upstream/ecc/skills/api-connector-builder/SKILL.md +120 -0
  146. package/bundled/upstream/ecc/skills/api-design/SKILL.md +523 -0
  147. package/bundled/upstream/ecc/skills/architecture-decision-records/SKILL.md +179 -0
  148. package/bundled/upstream/ecc/skills/article-writing/SKILL.md +79 -0
  149. package/bundled/upstream/ecc/skills/automation-audit-ops/SKILL.md +142 -0
  150. package/bundled/upstream/ecc/skills/autonomous-agent-harness/SKILL.md +267 -0
  151. package/bundled/upstream/ecc/skills/autonomous-loops/SKILL.md +610 -0
  152. package/bundled/upstream/ecc/skills/backend-patterns/SKILL.md +598 -0
  153. package/bundled/upstream/ecc/skills/benchmark/SKILL.md +93 -0
  154. package/bundled/upstream/ecc/skills/blueprint/SKILL.md +105 -0
  155. package/bundled/upstream/ecc/skills/brand-voice/SKILL.md +97 -0
  156. package/bundled/upstream/ecc/skills/brand-voice/references/voice-profile-schema.md +55 -0
  157. package/bundled/upstream/ecc/skills/browser-qa/SKILL.md +87 -0
  158. package/bundled/upstream/ecc/skills/bun-runtime/SKILL.md +84 -0
  159. package/bundled/upstream/ecc/skills/canary-watch/SKILL.md +99 -0
  160. package/bundled/upstream/ecc/skills/carrier-relationship-management/SKILL.md +212 -0
  161. package/bundled/upstream/ecc/skills/ck/SKILL.md +147 -0
  162. package/bundled/upstream/ecc/skills/ck/commands/forget.mjs +44 -0
  163. package/bundled/upstream/ecc/skills/ck/commands/info.mjs +24 -0
  164. package/bundled/upstream/ecc/skills/ck/commands/init.mjs +143 -0
  165. package/bundled/upstream/ecc/skills/ck/commands/list.mjs +40 -0
  166. package/bundled/upstream/ecc/skills/ck/commands/migrate.mjs +202 -0
  167. package/bundled/upstream/ecc/skills/ck/commands/resume.mjs +36 -0
  168. package/bundled/upstream/ecc/skills/ck/commands/save.mjs +210 -0
  169. package/bundled/upstream/ecc/skills/ck/commands/shared.mjs +387 -0
  170. package/bundled/upstream/ecc/skills/ck/hooks/session-start.mjs +224 -0
  171. package/bundled/upstream/ecc/skills/claude-api/SKILL.md +337 -0
  172. package/bundled/upstream/ecc/skills/claude-devfleet/SKILL.md +103 -0
  173. package/bundled/upstream/ecc/skills/click-path-audit/SKILL.md +244 -0
  174. package/bundled/upstream/ecc/skills/clickhouse-io/SKILL.md +439 -0
  175. package/bundled/upstream/ecc/skills/code-tour/SKILL.md +236 -0
  176. package/bundled/upstream/ecc/skills/codebase-onboarding/SKILL.md +233 -0
  177. package/bundled/upstream/ecc/skills/coding-standards/SKILL.md +549 -0
  178. package/bundled/upstream/ecc/skills/compose-multiplatform-patterns/SKILL.md +299 -0
  179. package/bundled/upstream/ecc/skills/configure-ecc/SKILL.md +367 -0
  180. package/bundled/upstream/ecc/skills/connections-optimizer/SKILL.md +189 -0
  181. package/bundled/upstream/ecc/skills/content-engine/SKILL.md +131 -0
  182. package/bundled/upstream/ecc/skills/content-hash-cache-pattern/SKILL.md +161 -0
  183. package/bundled/upstream/ecc/skills/context-budget/SKILL.md +135 -0
  184. package/bundled/upstream/ecc/skills/continuous-agent-loop/SKILL.md +45 -0
  185. package/bundled/upstream/ecc/skills/continuous-learning/SKILL.md +123 -0
  186. package/bundled/upstream/ecc/skills/continuous-learning/config.json +18 -0
  187. package/bundled/upstream/ecc/skills/continuous-learning/evaluate-session.sh +69 -0
  188. package/bundled/upstream/ecc/skills/continuous-learning-v2/SKILL.md +346 -0
  189. package/bundled/upstream/ecc/skills/continuous-learning-v2/agents/observer-loop.sh +282 -0
  190. package/bundled/upstream/ecc/skills/continuous-learning-v2/agents/observer.md +198 -0
  191. package/bundled/upstream/ecc/skills/continuous-learning-v2/agents/session-guardian.sh +150 -0
  192. package/bundled/upstream/ecc/skills/continuous-learning-v2/agents/start-observer.sh +244 -0
  193. package/bundled/upstream/ecc/skills/continuous-learning-v2/config.json +8 -0
  194. package/bundled/upstream/ecc/skills/continuous-learning-v2/hooks/observe.sh +460 -0
  195. package/bundled/upstream/ecc/skills/continuous-learning-v2/scripts/detect-project.sh +243 -0
  196. package/bundled/upstream/ecc/skills/continuous-learning-v2/scripts/instinct-cli.py +1426 -0
  197. package/bundled/upstream/ecc/skills/continuous-learning-v2/scripts/test_parse_instinct.py +984 -0
  198. package/bundled/upstream/ecc/skills/cost-aware-llm-pipeline/SKILL.md +183 -0
  199. package/bundled/upstream/ecc/skills/council/SKILL.md +203 -0
  200. package/bundled/upstream/ecc/skills/cpp-coding-standards/SKILL.md +723 -0
  201. package/bundled/upstream/ecc/skills/cpp-testing/SKILL.md +324 -0
  202. package/bundled/upstream/ecc/skills/crosspost/SKILL.md +111 -0
  203. package/bundled/upstream/ecc/skills/csharp-testing/SKILL.md +321 -0
  204. package/bundled/upstream/ecc/skills/customer-billing-ops/SKILL.md +140 -0
  205. package/bundled/upstream/ecc/skills/customs-trade-compliance/SKILL.md +263 -0
  206. package/bundled/upstream/ecc/skills/dart-flutter-patterns/SKILL.md +563 -0
  207. package/bundled/upstream/ecc/skills/dashboard-builder/SKILL.md +108 -0
  208. package/bundled/upstream/ecc/skills/data-scraper-agent/SKILL.md +764 -0
  209. package/bundled/upstream/ecc/skills/database-migrations/SKILL.md +429 -0
  210. package/bundled/upstream/ecc/skills/deep-research/SKILL.md +155 -0
  211. package/bundled/upstream/ecc/skills/defi-amm-security/SKILL.md +160 -0
  212. package/bundled/upstream/ecc/skills/deployment-patterns/SKILL.md +427 -0
  213. package/bundled/upstream/ecc/skills/design-system/SKILL.md +82 -0
  214. package/bundled/upstream/ecc/skills/django-patterns/SKILL.md +734 -0
  215. package/bundled/upstream/ecc/skills/django-security/SKILL.md +593 -0
  216. package/bundled/upstream/ecc/skills/django-tdd/SKILL.md +729 -0
  217. package/bundled/upstream/ecc/skills/django-verification/SKILL.md +469 -0
  218. package/bundled/upstream/ecc/skills/dmux-workflows/SKILL.md +191 -0
  219. package/bundled/upstream/ecc/skills/docker-patterns/SKILL.md +364 -0
  220. package/bundled/upstream/ecc/skills/documentation-lookup/SKILL.md +90 -0
  221. package/bundled/upstream/ecc/skills/dotnet-patterns/SKILL.md +321 -0
  222. package/bundled/upstream/ecc/skills/e2e-testing/SKILL.md +326 -0
  223. package/bundled/upstream/ecc/skills/ecc-tools-cost-audit/SKILL.md +160 -0
  224. package/bundled/upstream/ecc/skills/email-ops/SKILL.md +121 -0
  225. package/bundled/upstream/ecc/skills/energy-procurement/SKILL.md +228 -0
  226. package/bundled/upstream/ecc/skills/enterprise-agent-ops/SKILL.md +50 -0
  227. package/bundled/upstream/ecc/skills/eval-harness/SKILL.md +270 -0
  228. package/bundled/upstream/ecc/skills/evm-token-decimals/SKILL.md +130 -0
  229. package/bundled/upstream/ecc/skills/exa-search/SKILL.md +103 -0
  230. package/bundled/upstream/ecc/skills/fal-ai-media/SKILL.md +284 -0
  231. package/bundled/upstream/ecc/skills/finance-billing-ops/SKILL.md +127 -0
  232. package/bundled/upstream/ecc/skills/flutter-dart-code-review/SKILL.md +435 -0
  233. package/bundled/upstream/ecc/skills/foundation-models-on-device/SKILL.md +243 -0
  234. package/bundled/upstream/ecc/skills/frontend-design/SKILL.md +145 -0
  235. package/bundled/upstream/ecc/skills/frontend-patterns/SKILL.md +642 -0
  236. package/bundled/upstream/ecc/skills/frontend-slides/SKILL.md +184 -0
  237. package/bundled/upstream/ecc/skills/frontend-slides/STYLE_PRESETS.md +330 -0
  238. package/bundled/upstream/ecc/skills/gan-style-harness/SKILL.md +278 -0
  239. package/bundled/upstream/ecc/skills/gateguard/SKILL.md +121 -0
  240. package/bundled/upstream/ecc/skills/git-workflow/SKILL.md +715 -0
  241. package/bundled/upstream/ecc/skills/github-ops/SKILL.md +144 -0
  242. package/bundled/upstream/ecc/skills/golang-patterns/SKILL.md +674 -0
  243. package/bundled/upstream/ecc/skills/golang-testing/SKILL.md +720 -0
  244. package/bundled/upstream/ecc/skills/google-workspace-ops/SKILL.md +95 -0
  245. package/bundled/upstream/ecc/skills/healthcare-cdss-patterns/SKILL.md +245 -0
  246. package/bundled/upstream/ecc/skills/healthcare-emr-patterns/SKILL.md +159 -0
  247. package/bundled/upstream/ecc/skills/healthcare-eval-harness/SKILL.md +207 -0
  248. package/bundled/upstream/ecc/skills/healthcare-phi-compliance/SKILL.md +145 -0
  249. package/bundled/upstream/ecc/skills/hexagonal-architecture/SKILL.md +276 -0
  250. package/bundled/upstream/ecc/skills/hipaa-compliance/SKILL.md +78 -0
  251. package/bundled/upstream/ecc/skills/hookify-rules/SKILL.md +128 -0
  252. package/bundled/upstream/ecc/skills/inventory-demand-planning/SKILL.md +247 -0
  253. package/bundled/upstream/ecc/skills/investor-materials/SKILL.md +96 -0
  254. package/bundled/upstream/ecc/skills/investor-outreach/SKILL.md +91 -0
  255. package/bundled/upstream/ecc/skills/iterative-retrieval/SKILL.md +211 -0
  256. package/bundled/upstream/ecc/skills/java-coding-standards/SKILL.md +147 -0
  257. package/bundled/upstream/ecc/skills/jira-integration/SKILL.md +293 -0
  258. package/bundled/upstream/ecc/skills/jpa-patterns/SKILL.md +151 -0
  259. package/bundled/upstream/ecc/skills/knowledge-ops/SKILL.md +154 -0
  260. package/bundled/upstream/ecc/skills/kotlin-coroutines-flows/SKILL.md +284 -0
  261. package/bundled/upstream/ecc/skills/kotlin-exposed-patterns/SKILL.md +719 -0
  262. package/bundled/upstream/ecc/skills/kotlin-ktor-patterns/SKILL.md +689 -0
  263. package/bundled/upstream/ecc/skills/kotlin-patterns/SKILL.md +711 -0
  264. package/bundled/upstream/ecc/skills/kotlin-testing/SKILL.md +824 -0
  265. package/bundled/upstream/ecc/skills/laravel-patterns/SKILL.md +415 -0
  266. package/bundled/upstream/ecc/skills/laravel-plugin-discovery/SKILL.md +229 -0
  267. package/bundled/upstream/ecc/skills/laravel-security/SKILL.md +285 -0
  268. package/bundled/upstream/ecc/skills/laravel-tdd/SKILL.md +283 -0
  269. package/bundled/upstream/ecc/skills/laravel-verification/SKILL.md +179 -0
  270. package/bundled/upstream/ecc/skills/lead-intelligence/SKILL.md +321 -0
  271. package/bundled/upstream/ecc/skills/lead-intelligence/agents/enrichment-agent.md +85 -0
  272. package/bundled/upstream/ecc/skills/lead-intelligence/agents/mutual-mapper.md +75 -0
  273. package/bundled/upstream/ecc/skills/lead-intelligence/agents/outreach-drafter.md +98 -0
  274. package/bundled/upstream/ecc/skills/lead-intelligence/agents/signal-scorer.md +60 -0
  275. package/bundled/upstream/ecc/skills/liquid-glass-design/SKILL.md +279 -0
  276. package/bundled/upstream/ecc/skills/llm-trading-agent-security/SKILL.md +146 -0
  277. package/bundled/upstream/ecc/skills/logistics-exception-management/SKILL.md +222 -0
  278. package/bundled/upstream/ecc/skills/manim-video/SKILL.md +89 -0
  279. package/bundled/upstream/ecc/skills/manim-video/assets/network_graph_scene.py +52 -0
  280. package/bundled/upstream/ecc/skills/market-research/SKILL.md +75 -0
  281. package/bundled/upstream/ecc/skills/mcp-server-patterns/SKILL.md +69 -0
  282. package/bundled/upstream/ecc/skills/messages-ops/SKILL.md +104 -0
  283. package/bundled/upstream/ecc/skills/nanoclaw-repl/SKILL.md +33 -0
  284. package/bundled/upstream/ecc/skills/nestjs-patterns/SKILL.md +230 -0
  285. package/bundled/upstream/ecc/skills/nextjs-turbopack/SKILL.md +44 -0
  286. package/bundled/upstream/ecc/skills/nodejs-keccak256/SKILL.md +102 -0
  287. package/bundled/upstream/ecc/skills/nutrient-document-processing/SKILL.md +167 -0
  288. package/bundled/upstream/ecc/skills/nuxt4-patterns/SKILL.md +100 -0
  289. package/bundled/upstream/ecc/skills/openclaw-persona-forge/SKILL.md +296 -0
  290. package/bundled/upstream/ecc/skills/openclaw-persona-forge/gacha.py +224 -0
  291. package/bundled/upstream/ecc/skills/openclaw-persona-forge/gacha.sh +5 -0
  292. package/bundled/upstream/ecc/skills/openclaw-persona-forge/references/avatar-style.md +124 -0
  293. package/bundled/upstream/ecc/skills/openclaw-persona-forge/references/boundary-rules.md +53 -0
  294. package/bundled/upstream/ecc/skills/openclaw-persona-forge/references/error-handling.md +53 -0
  295. package/bundled/upstream/ecc/skills/openclaw-persona-forge/references/identity-tension.md +48 -0
  296. package/bundled/upstream/ecc/skills/openclaw-persona-forge/references/naming-system.md +39 -0
  297. package/bundled/upstream/ecc/skills/openclaw-persona-forge/references/output-template.md +166 -0
  298. package/bundled/upstream/ecc/skills/opensource-pipeline/SKILL.md +255 -0
  299. package/bundled/upstream/ecc/skills/perl-patterns/SKILL.md +504 -0
  300. package/bundled/upstream/ecc/skills/perl-security/SKILL.md +503 -0
  301. package/bundled/upstream/ecc/skills/perl-testing/SKILL.md +475 -0
  302. package/bundled/upstream/ecc/skills/plankton-code-quality/SKILL.md +236 -0
  303. package/bundled/upstream/ecc/skills/postgres-patterns/SKILL.md +147 -0
  304. package/bundled/upstream/ecc/skills/product-capability/SKILL.md +141 -0
  305. package/bundled/upstream/ecc/skills/product-lens/SKILL.md +92 -0
  306. package/bundled/upstream/ecc/skills/production-scheduling/SKILL.md +238 -0
  307. package/bundled/upstream/ecc/skills/project-flow-ops/SKILL.md +111 -0
  308. package/bundled/upstream/ecc/skills/prompt-optimizer/SKILL.md +397 -0
  309. package/bundled/upstream/ecc/skills/python-patterns/SKILL.md +750 -0
  310. package/bundled/upstream/ecc/skills/python-testing/SKILL.md +816 -0
  311. package/bundled/upstream/ecc/skills/pytorch-patterns/SKILL.md +396 -0
  312. package/bundled/upstream/ecc/skills/quality-nonconformance/SKILL.md +260 -0
  313. package/bundled/upstream/ecc/skills/ralphinho-rfc-pipeline/SKILL.md +67 -0
  314. package/bundled/upstream/ecc/skills/regex-vs-llm-structured-text/SKILL.md +220 -0
  315. package/bundled/upstream/ecc/skills/remotion-video-creation/SKILL.md +43 -0
  316. package/bundled/upstream/ecc/skills/remotion-video-creation/rules/3d.md +86 -0
  317. package/bundled/upstream/ecc/skills/remotion-video-creation/rules/animations.md +29 -0
  318. package/bundled/upstream/ecc/skills/remotion-video-creation/rules/assets/charts-bar-chart.tsx +173 -0
  319. package/bundled/upstream/ecc/skills/remotion-video-creation/rules/assets/text-animations-typewriter.tsx +100 -0
  320. package/bundled/upstream/ecc/skills/remotion-video-creation/rules/assets/text-animations-word-highlight.tsx +108 -0
  321. package/bundled/upstream/ecc/skills/remotion-video-creation/rules/assets.md +78 -0
  322. package/bundled/upstream/ecc/skills/remotion-video-creation/rules/audio.md +172 -0
  323. package/bundled/upstream/ecc/skills/remotion-video-creation/rules/calculate-metadata.md +104 -0
  324. package/bundled/upstream/ecc/skills/remotion-video-creation/rules/can-decode.md +75 -0
  325. package/bundled/upstream/ecc/skills/remotion-video-creation/rules/charts.md +58 -0
  326. package/bundled/upstream/ecc/skills/remotion-video-creation/rules/compositions.md +146 -0
  327. package/bundled/upstream/ecc/skills/remotion-video-creation/rules/display-captions.md +126 -0
  328. package/bundled/upstream/ecc/skills/remotion-video-creation/rules/extract-frames.md +229 -0
  329. package/bundled/upstream/ecc/skills/remotion-video-creation/rules/fonts.md +152 -0
  330. package/bundled/upstream/ecc/skills/remotion-video-creation/rules/get-audio-duration.md +58 -0
  331. package/bundled/upstream/ecc/skills/remotion-video-creation/rules/get-video-dimensions.md +68 -0
  332. package/bundled/upstream/ecc/skills/remotion-video-creation/rules/get-video-duration.md +58 -0
  333. package/bundled/upstream/ecc/skills/remotion-video-creation/rules/gifs.md +138 -0
  334. package/bundled/upstream/ecc/skills/remotion-video-creation/rules/images.md +130 -0
  335. package/bundled/upstream/ecc/skills/remotion-video-creation/rules/import-srt-captions.md +67 -0
  336. package/bundled/upstream/ecc/skills/remotion-video-creation/rules/lottie.md +67 -0
  337. package/bundled/upstream/ecc/skills/remotion-video-creation/rules/measuring-dom-nodes.md +34 -0
  338. package/bundled/upstream/ecc/skills/remotion-video-creation/rules/measuring-text.md +143 -0
  339. package/bundled/upstream/ecc/skills/remotion-video-creation/rules/sequencing.md +106 -0
  340. package/bundled/upstream/ecc/skills/remotion-video-creation/rules/tailwind.md +11 -0
  341. package/bundled/upstream/ecc/skills/remotion-video-creation/rules/text-animations.md +20 -0
  342. package/bundled/upstream/ecc/skills/remotion-video-creation/rules/timing.md +179 -0
  343. package/bundled/upstream/ecc/skills/remotion-video-creation/rules/transcribe-captions.md +19 -0
  344. package/bundled/upstream/ecc/skills/remotion-video-creation/rules/transitions.md +122 -0
  345. package/bundled/upstream/ecc/skills/remotion-video-creation/rules/trimming.md +52 -0
  346. package/bundled/upstream/ecc/skills/remotion-video-creation/rules/videos.md +171 -0
  347. package/bundled/upstream/ecc/skills/repo-scan/SKILL.md +78 -0
  348. package/bundled/upstream/ecc/skills/research-ops/SKILL.md +112 -0
  349. package/bundled/upstream/ecc/skills/returns-reverse-logistics/SKILL.md +240 -0
  350. package/bundled/upstream/ecc/skills/rules-distill/SKILL.md +264 -0
  351. package/bundled/upstream/ecc/skills/rules-distill/scripts/scan-rules.sh +58 -0
  352. package/bundled/upstream/ecc/skills/rules-distill/scripts/scan-skills.sh +129 -0
  353. package/bundled/upstream/ecc/skills/rust-patterns/SKILL.md +499 -0
  354. package/bundled/upstream/ecc/skills/rust-testing/SKILL.md +500 -0
  355. package/bundled/upstream/ecc/skills/safety-guard/SKILL.md +75 -0
  356. package/bundled/upstream/ecc/skills/santa-method/SKILL.md +306 -0
  357. package/bundled/upstream/ecc/skills/search-first/SKILL.md +161 -0
  358. package/bundled/upstream/ecc/skills/security-bounty-hunter/SKILL.md +99 -0
  359. package/bundled/upstream/ecc/skills/security-review/SKILL.md +495 -0
  360. package/bundled/upstream/ecc/skills/security-review/cloud-infrastructure-security.md +361 -0
  361. package/bundled/upstream/ecc/skills/security-scan/SKILL.md +165 -0
  362. package/bundled/upstream/ecc/skills/seo/SKILL.md +154 -0
  363. package/bundled/upstream/ecc/skills/skill-comply/SKILL.md +58 -0
  364. package/bundled/upstream/ecc/skills/skill-comply/fixtures/compliant_trace.jsonl +5 -0
  365. package/bundled/upstream/ecc/skills/skill-comply/fixtures/noncompliant_trace.jsonl +3 -0
  366. package/bundled/upstream/ecc/skills/skill-comply/fixtures/tdd_spec.yaml +44 -0
  367. package/bundled/upstream/ecc/skills/skill-comply/prompts/classifier.md +24 -0
  368. package/bundled/upstream/ecc/skills/skill-comply/prompts/scenario_generator.md +62 -0
  369. package/bundled/upstream/ecc/skills/skill-comply/prompts/spec_generator.md +42 -0
  370. package/bundled/upstream/ecc/skills/skill-comply/pyproject.toml +15 -0
  371. package/bundled/upstream/ecc/skills/skill-comply/scripts/__init__.py +0 -0
  372. package/bundled/upstream/ecc/skills/skill-comply/scripts/classifier.py +85 -0
  373. package/bundled/upstream/ecc/skills/skill-comply/scripts/grader.py +124 -0
  374. package/bundled/upstream/ecc/skills/skill-comply/scripts/parser.py +107 -0
  375. package/bundled/upstream/ecc/skills/skill-comply/scripts/report.py +170 -0
  376. package/bundled/upstream/ecc/skills/skill-comply/scripts/run.py +127 -0
  377. package/bundled/upstream/ecc/skills/skill-comply/scripts/runner.py +161 -0
  378. package/bundled/upstream/ecc/skills/skill-comply/scripts/scenario_generator.py +70 -0
  379. package/bundled/upstream/ecc/skills/skill-comply/scripts/spec_generator.py +72 -0
  380. package/bundled/upstream/ecc/skills/skill-comply/scripts/utils.py +13 -0
  381. package/bundled/upstream/ecc/skills/skill-comply/tests/test_grader.py +197 -0
  382. package/bundled/upstream/ecc/skills/skill-comply/tests/test_parser.py +90 -0
  383. package/bundled/upstream/ecc/skills/skill-stocktake/SKILL.md +193 -0
  384. package/bundled/upstream/ecc/skills/skill-stocktake/scripts/quick-diff.sh +87 -0
  385. package/bundled/upstream/ecc/skills/skill-stocktake/scripts/save-results.sh +56 -0
  386. package/bundled/upstream/ecc/skills/skill-stocktake/scripts/scan.sh +170 -0
  387. package/bundled/upstream/ecc/skills/social-graph-ranker/SKILL.md +154 -0
  388. package/bundled/upstream/ecc/skills/springboot-patterns/SKILL.md +314 -0
  389. package/bundled/upstream/ecc/skills/springboot-security/SKILL.md +272 -0
  390. package/bundled/upstream/ecc/skills/springboot-tdd/SKILL.md +158 -0
  391. package/bundled/upstream/ecc/skills/springboot-verification/SKILL.md +231 -0
  392. package/bundled/upstream/ecc/skills/strategic-compact/SKILL.md +131 -0
  393. package/bundled/upstream/ecc/skills/strategic-compact/suggest-compact.sh +54 -0
  394. package/bundled/upstream/ecc/skills/swift-actor-persistence/SKILL.md +143 -0
  395. package/bundled/upstream/ecc/skills/swift-concurrency-6-2/SKILL.md +216 -0
  396. package/bundled/upstream/ecc/skills/swift-protocol-di-testing/SKILL.md +190 -0
  397. package/bundled/upstream/ecc/skills/swiftui-patterns/SKILL.md +259 -0
  398. package/bundled/upstream/ecc/skills/tdd-workflow/SKILL.md +463 -0
  399. package/bundled/upstream/ecc/skills/team-builder/SKILL.md +168 -0
  400. package/bundled/upstream/ecc/skills/terminal-ops/SKILL.md +109 -0
  401. package/bundled/upstream/ecc/skills/token-budget-advisor/SKILL.md +133 -0
  402. package/bundled/upstream/ecc/skills/ui-demo/SKILL.md +465 -0
  403. package/bundled/upstream/ecc/skills/unified-notifications-ops/SKILL.md +187 -0
  404. package/bundled/upstream/ecc/skills/verification-loop/SKILL.md +126 -0
  405. package/bundled/upstream/ecc/skills/video-editing/SKILL.md +310 -0
  406. package/bundled/upstream/ecc/skills/videodb/SKILL.md +374 -0
  407. package/bundled/upstream/ecc/skills/videodb/reference/api-reference.md +550 -0
  408. package/bundled/upstream/ecc/skills/videodb/reference/capture-reference.md +407 -0
  409. package/bundled/upstream/ecc/skills/videodb/reference/capture.md +101 -0
  410. package/bundled/upstream/ecc/skills/videodb/reference/editor.md +443 -0
  411. package/bundled/upstream/ecc/skills/videodb/reference/generative.md +331 -0
  412. package/bundled/upstream/ecc/skills/videodb/reference/rtstream-reference.md +564 -0
  413. package/bundled/upstream/ecc/skills/videodb/reference/rtstream.md +65 -0
  414. package/bundled/upstream/ecc/skills/videodb/reference/search.md +230 -0
  415. package/bundled/upstream/ecc/skills/videodb/reference/streaming.md +406 -0
  416. package/bundled/upstream/ecc/skills/videodb/reference/use-cases.md +118 -0
  417. package/bundled/upstream/ecc/skills/videodb/scripts/ws_listener.py +282 -0
  418. package/bundled/upstream/ecc/skills/visa-doc-translate/README.md +86 -0
  419. package/bundled/upstream/ecc/skills/visa-doc-translate/SKILL.md +117 -0
  420. package/bundled/upstream/ecc/skills/workspace-surface-audit/SKILL.md +125 -0
  421. package/bundled/upstream/ecc/skills/x-api/SKILL.md +230 -0
  422. package/bundled/upstream/superpowers/.omc-source/last-plan-apply.json +22 -0
  423. package/package.json +3 -1
  424. package/src/catalog/source-catalog.js +391 -0
  425. package/src/cli/artifact.js +3 -2
  426. package/src/cli/doctor.js +25 -4
  427. package/src/cli/index.js +19 -0
  428. package/src/cli/plan.js +220 -0
  429. package/src/cli/setup.js +209 -12
  430. package/src/cli/source.js +110 -3
  431. package/src/config/paths.js +31 -0
  432. package/src/config/sources.js +103 -10
  433. package/src/merge/hook-merger.js +1 -0
@@ -0,0 +1,460 @@
1
+ #!/bin/bash
2
+ # Continuous Learning v2 - Observation Hook
3
+ #
4
+ # Captures tool use events for pattern analysis.
5
+ # Claude Code passes hook data via stdin as JSON.
6
+ #
7
+ # v2.1: Project-scoped observations — detects current project context
8
+ # and writes observations to project-specific directory.
9
+ #
10
+ # Registered via plugin hooks/hooks.json (auto-loaded when plugin is enabled).
11
+ # Can also be registered manually in ~/.claude/settings.json.
12
+
13
+ set -e
14
+
15
+ # Hook phase from CLI argument: "pre" (PreToolUse) or "post" (PostToolUse)
16
+ HOOK_PHASE="${1:-post}"
17
+
18
+ # ─────────────────────────────────────────────
19
+ # Read stdin first (before project detection)
20
+ # ─────────────────────────────────────────────
21
+
22
+ # Read JSON from stdin (Claude Code hook format)
23
+ INPUT_JSON=$(cat)
24
+
25
+ # Exit if no input
26
+ if [ -z "$INPUT_JSON" ]; then
27
+ exit 0
28
+ fi
29
+
30
+ _is_windows_app_installer_stub() {
31
+ # Windows 10/11 ships an "App Execution Alias" stub at
32
+ # %LOCALAPPDATA%\Microsoft\WindowsApps\python.exe
33
+ # %LOCALAPPDATA%\Microsoft\WindowsApps\python3.exe
34
+ # Both are symlinks to AppInstallerPythonRedirector.exe which, when Python
35
+ # is not installed from the Store, neither launches Python nor honors "-c".
36
+ # Calls to it hang or print a bare "Python " line, silently breaking every
37
+ # JSON-parsing step in this hook. Detect and skip such stubs here.
38
+ local _candidate="$1"
39
+ [ -z "$_candidate" ] && return 1
40
+ local _resolved
41
+ _resolved="$(command -v "$_candidate" 2>/dev/null || true)"
42
+ [ -z "$_resolved" ] && return 1
43
+ case "$_resolved" in
44
+ *AppInstallerPythonRedirector.exe|*AppInstallerPythonRedirector.EXE) return 0 ;;
45
+ esac
46
+ # Also resolve one level of symlink on POSIX-like shells (Git Bash, WSL).
47
+ if command -v readlink >/dev/null 2>&1; then
48
+ local _target
49
+ _target="$(readlink -f "$_resolved" 2>/dev/null || readlink "$_resolved" 2>/dev/null || true)"
50
+ case "$_target" in
51
+ *AppInstallerPythonRedirector.exe|*AppInstallerPythonRedirector.EXE) return 0 ;;
52
+ esac
53
+ fi
54
+ return 1
55
+ }
56
+
57
+ resolve_python_cmd() {
58
+ if [ -n "${CLV2_PYTHON_CMD:-}" ] && command -v "$CLV2_PYTHON_CMD" >/dev/null 2>&1; then
59
+ printf '%s\n' "$CLV2_PYTHON_CMD"
60
+ return 0
61
+ fi
62
+
63
+ if command -v python3 >/dev/null 2>&1 && ! _is_windows_app_installer_stub python3; then
64
+ printf '%s\n' python3
65
+ return 0
66
+ fi
67
+
68
+ if command -v python >/dev/null 2>&1 && ! _is_windows_app_installer_stub python; then
69
+ printf '%s\n' python
70
+ return 0
71
+ fi
72
+
73
+ return 1
74
+ }
75
+
76
+ PYTHON_CMD="$(resolve_python_cmd 2>/dev/null || true)"
77
+ if [ -z "$PYTHON_CMD" ]; then
78
+ echo "[observe] No python interpreter found, skipping observation" >&2
79
+ exit 0
80
+ fi
81
+
82
+ # Propagate our stub-aware selection so detect-project.sh (which is sourced
83
+ # below) does not re-resolve and silently fall back to the App Installer stub.
84
+ # detect-project.sh honors an already-set CLV2_PYTHON_CMD.
85
+ export CLV2_PYTHON_CMD="${CLV2_PYTHON_CMD:-$PYTHON_CMD}"
86
+
87
+ # ─────────────────────────────────────────────
88
+ # Extract cwd from stdin for project detection
89
+ # ─────────────────────────────────────────────
90
+
91
+ # Extract cwd from the hook JSON to use for project detection.
92
+ # If cwd is a subdirectory inside a git repo, resolve it to the repo root so
93
+ # observations attach to the project instead of a nested path.
94
+ STDIN_CWD=$(echo "$INPUT_JSON" | "$PYTHON_CMD" -c '
95
+ import json, sys
96
+ try:
97
+ data = json.load(sys.stdin)
98
+ cwd = data.get("cwd", "")
99
+ print(cwd)
100
+ except(KeyError, TypeError, ValueError):
101
+ print("")
102
+ ' 2>/dev/null || echo "")
103
+
104
+ # If cwd was provided in stdin, use it for project detection
105
+ if [ -n "$STDIN_CWD" ] && [ -d "$STDIN_CWD" ]; then
106
+ _GIT_ROOT=$(git -C "$STDIN_CWD" rev-parse --show-toplevel 2>/dev/null || true)
107
+ export CLAUDE_PROJECT_DIR="${_GIT_ROOT:-$STDIN_CWD}"
108
+ fi
109
+
110
+ # ─────────────────────────────────────────────
111
+ # Lightweight config and automated session guards
112
+ # ─────────────────────────────────────────────
113
+ #
114
+ # IMPORTANT: keep these guards above detect-project.sh.
115
+ # Sourcing detect-project.sh creates project-scoped directories and updates
116
+ # projects.json, so automated sessions must return before that point.
117
+
118
+ CONFIG_DIR="${HOME}/.claude/homunculus"
119
+
120
+ # Skip if disabled (check both default and CLV2_CONFIG-derived locations)
121
+ if [ -f "$CONFIG_DIR/disabled" ]; then
122
+ exit 0
123
+ fi
124
+ if [ -n "${CLV2_CONFIG:-}" ] && [ -f "$(dirname "$CLV2_CONFIG")/disabled" ]; then
125
+ exit 0
126
+ fi
127
+
128
+ # Prevent observe.sh from firing on non-human sessions to avoid:
129
+ # - ECC observing its own Haiku observer sessions (self-loop)
130
+ # - ECC observing other tools' automated sessions
131
+ # - automated sessions creating project-scoped homunculus metadata
132
+
133
+ # Layer 1: entrypoint. Only interactive terminal sessions should continue.
134
+ # sdk-ts: Agent SDK sessions can be human-interactive (e.g. via Happy).
135
+ # Non-interactive SDK automation is still filtered by Layers 2-5 below
136
+ # (ECC_HOOK_PROFILE=minimal, ECC_SKIP_OBSERVE=1, agent_id, path exclusions).
137
+ case "${CLAUDE_CODE_ENTRYPOINT:-cli}" in
138
+ cli|sdk-ts|claude-desktop) ;;
139
+ *) exit 0 ;;
140
+ esac
141
+
142
+ # Layer 2: minimal hook profile suppresses non-essential hooks.
143
+ [ "${ECC_HOOK_PROFILE:-standard}" = "minimal" ] && exit 0
144
+
145
+ # Layer 3: cooperative skip env var for automated sessions.
146
+ [ "${ECC_SKIP_OBSERVE:-0}" = "1" ] && exit 0
147
+
148
+ # Layer 4: subagent sessions are automated by definition.
149
+ _ECC_AGENT_ID=$(echo "$INPUT_JSON" | "$PYTHON_CMD" -c "import json,sys; print(json.load(sys.stdin).get('agent_id',''))" 2>/dev/null || true)
150
+ [ -n "$_ECC_AGENT_ID" ] && exit 0
151
+
152
+ # Layer 5: known observer-session path exclusions.
153
+ _ECC_SKIP_PATHS="${ECC_OBSERVE_SKIP_PATHS:-observer-sessions,.claude-mem}"
154
+ if [ -n "$STDIN_CWD" ]; then
155
+ IFS=',' read -ra _ECC_SKIP_ARRAY <<< "$_ECC_SKIP_PATHS"
156
+ for _pattern in "${_ECC_SKIP_ARRAY[@]}"; do
157
+ _pattern="${_pattern#"${_pattern%%[![:space:]]*}"}"
158
+ _pattern="${_pattern%"${_pattern##*[![:space:]]}"}"
159
+ [ -z "$_pattern" ] && continue
160
+ case "$STDIN_CWD" in *"$_pattern"*) exit 0 ;; esac
161
+ done
162
+ fi
163
+
164
+ # ─────────────────────────────────────────────
165
+ # Project detection
166
+ # ─────────────────────────────────────────────
167
+
168
+ SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
169
+ SKILL_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
170
+
171
+ # Source shared project detection helper
172
+ # This sets: PROJECT_ID, PROJECT_NAME, PROJECT_ROOT, PROJECT_DIR
173
+ source "${SKILL_ROOT}/scripts/detect-project.sh"
174
+ PYTHON_CMD="${CLV2_PYTHON_CMD:-$PYTHON_CMD}"
175
+
176
+ # ─────────────────────────────────────────────
177
+ # Configuration
178
+ # ─────────────────────────────────────────────
179
+
180
+ OBSERVATIONS_FILE="${PROJECT_DIR}/observations.jsonl"
181
+ MAX_FILE_SIZE_MB=10
182
+
183
+ # Auto-purge observation files older than 30 days (runs once per session)
184
+ PURGE_MARKER="${PROJECT_DIR}/.last-purge"
185
+ if [ ! -f "$PURGE_MARKER" ] || [ "$(find "$PURGE_MARKER" -mtime +1 2>/dev/null)" ]; then
186
+ find "${PROJECT_DIR}" -name "observations-*.jsonl" -mtime +30 -delete 2>/dev/null || true
187
+ touch "$PURGE_MARKER" 2>/dev/null || true
188
+ fi
189
+
190
+ # Parse using Python via stdin pipe (safe for all JSON payloads)
191
+ # Pass HOOK_PHASE via env var since Claude Code does not include hook type in stdin JSON
192
+ PARSED=$(echo "$INPUT_JSON" | HOOK_PHASE="$HOOK_PHASE" "$PYTHON_CMD" -c '
193
+ import json
194
+ import sys
195
+ import os
196
+
197
+ try:
198
+ data = json.load(sys.stdin)
199
+
200
+ # Determine event type from CLI argument passed via env var.
201
+ # Claude Code does NOT include a "hook_type" field in the stdin JSON,
202
+ # so we rely on the shell argument ("pre" or "post") instead.
203
+ hook_phase = os.environ.get("HOOK_PHASE", "post")
204
+ event = "tool_start" if hook_phase == "pre" else "tool_complete"
205
+
206
+ # Extract fields - Claude Code hook format
207
+ tool_name = data.get("tool_name", data.get("tool", "unknown"))
208
+ tool_input = data.get("tool_input", data.get("input", {}))
209
+ tool_output = data.get("tool_response")
210
+ if tool_output is None:
211
+ tool_output = data.get("tool_output", data.get("output", ""))
212
+ session_id = data.get("session_id", "unknown")
213
+ tool_use_id = data.get("tool_use_id", "")
214
+ cwd = data.get("cwd", "")
215
+
216
+ # Truncate large inputs/outputs
217
+ if isinstance(tool_input, dict):
218
+ tool_input_str = json.dumps(tool_input)[:5000]
219
+ else:
220
+ tool_input_str = str(tool_input)[:5000]
221
+
222
+ if isinstance(tool_output, dict):
223
+ tool_response_str = json.dumps(tool_output)[:5000]
224
+ else:
225
+ tool_response_str = str(tool_output)[:5000]
226
+
227
+ print(json.dumps({
228
+ "parsed": True,
229
+ "event": event,
230
+ "tool": tool_name,
231
+ "input": tool_input_str if event == "tool_start" else None,
232
+ "output": tool_response_str if event == "tool_complete" else None,
233
+ "session": session_id,
234
+ "tool_use_id": tool_use_id,
235
+ "cwd": cwd
236
+ }))
237
+ except Exception as e:
238
+ print(json.dumps({"parsed": False, "error": str(e)}))
239
+ ')
240
+
241
+ # Check if parsing succeeded
242
+ PARSED_OK=$(echo "$PARSED" | "$PYTHON_CMD" -c "import json,sys; print(json.load(sys.stdin).get('parsed', False))" 2>/dev/null || echo "False")
243
+
244
+ if [ "$PARSED_OK" != "True" ]; then
245
+ # Fallback: log raw input for debugging (scrub secrets before persisting)
246
+ timestamp=$(date -u +"%Y-%m-%dT%H:%M:%SZ")
247
+ export TIMESTAMP="$timestamp"
248
+ echo "$INPUT_JSON" | "$PYTHON_CMD" -c '
249
+ import json, sys, os, re
250
+
251
+ _SECRET_RE = re.compile(
252
+ r"(?i)(api[_-]?key|token|secret|password|authorization|credentials?|auth)"
253
+ r"""(["'"'"'\s:=]+)"""
254
+ r"([A-Za-z]+\s+)?"
255
+ r"([A-Za-z0-9_\-/.+=]{8,})"
256
+ )
257
+
258
+ raw = sys.stdin.read()[:2000]
259
+ raw = _SECRET_RE.sub(lambda m: m.group(1) + m.group(2) + (m.group(3) or "") + "[REDACTED]", raw)
260
+ print(json.dumps({"timestamp": os.environ["TIMESTAMP"], "event": "parse_error", "raw": raw}))
261
+ ' >> "$OBSERVATIONS_FILE"
262
+ exit 0
263
+ fi
264
+
265
+ # Archive if file too large (atomic: rename with unique suffix to avoid race)
266
+ if [ -f "$OBSERVATIONS_FILE" ]; then
267
+ file_size_mb=$(du -m "$OBSERVATIONS_FILE" 2>/dev/null | cut -f1)
268
+ if [ "${file_size_mb:-0}" -ge "$MAX_FILE_SIZE_MB" ]; then
269
+ archive_dir="${PROJECT_DIR}/observations.archive"
270
+ mkdir -p "$archive_dir"
271
+ mv "$OBSERVATIONS_FILE" "$archive_dir/observations-$(date +%Y%m%d-%H%M%S)-$$.jsonl" 2>/dev/null || true
272
+ fi
273
+ fi
274
+
275
+ # Build and write observation (now includes project context)
276
+ # Scrub common secret patterns from tool I/O before persisting
277
+ timestamp=$(date -u +"%Y-%m-%dT%H:%M:%SZ")
278
+
279
+ export PROJECT_ID_ENV="$PROJECT_ID"
280
+ export PROJECT_NAME_ENV="$PROJECT_NAME"
281
+ export TIMESTAMP="$timestamp"
282
+
283
+ echo "$PARSED" | "$PYTHON_CMD" -c '
284
+ import json, sys, os, re
285
+
286
+ parsed = json.load(sys.stdin)
287
+ observation = {
288
+ "timestamp": os.environ["TIMESTAMP"],
289
+ "event": parsed["event"],
290
+ "tool": parsed["tool"],
291
+ "session": parsed["session"],
292
+ "project_id": os.environ.get("PROJECT_ID_ENV", "global"),
293
+ "project_name": os.environ.get("PROJECT_NAME_ENV", "global")
294
+ }
295
+
296
+ # Scrub secrets: match common key=value, key: value, and key"value patterns
297
+ # Includes optional auth scheme (e.g., "Bearer", "Basic") before token
298
+ _SECRET_RE = re.compile(
299
+ r"(?i)(api[_-]?key|token|secret|password|authorization|credentials?|auth)"
300
+ r"""(["'"'"'\s:=]+)"""
301
+ r"([A-Za-z]+\s+)?"
302
+ r"([A-Za-z0-9_\-/.+=]{8,})"
303
+ )
304
+
305
+ def scrub(val):
306
+ if val is None:
307
+ return None
308
+ return _SECRET_RE.sub(lambda m: m.group(1) + m.group(2) + (m.group(3) or "") + "[REDACTED]", str(val))
309
+
310
+ if parsed["input"]:
311
+ observation["input"] = scrub(parsed["input"])
312
+ if parsed["output"] is not None:
313
+ observation["output"] = scrub(parsed["output"])
314
+
315
+ print(json.dumps(observation))
316
+ ' >> "$OBSERVATIONS_FILE"
317
+
318
+ # Lazy-start observer if enabled but not running (first-time setup)
319
+ # Use flock for atomic check-then-act to prevent race conditions
320
+ # Fallback for macOS (no flock): use lockfile or skip
321
+ LAZY_START_LOCK="${PROJECT_DIR}/.observer-start.lock"
322
+ _CHECK_OBSERVER_RUNNING() {
323
+ local pid_file="$1"
324
+ if [ -f "$pid_file" ]; then
325
+ local pid
326
+ pid=$(cat "$pid_file" 2>/dev/null)
327
+ # Validate PID is a positive integer (>1) to prevent signaling invalid targets
328
+ case "$pid" in
329
+ ''|*[!0-9]*|0|1)
330
+ rm -f "$pid_file" 2>/dev/null || true
331
+ return 1
332
+ ;;
333
+ esac
334
+ if kill -0 "$pid" 2>/dev/null; then
335
+ return 0 # Process is alive
336
+ fi
337
+ # Stale PID file - remove it
338
+ rm -f "$pid_file" 2>/dev/null || true
339
+ fi
340
+ return 1 # No PID file or process dead
341
+ }
342
+
343
+ if [ -f "${CONFIG_DIR}/disabled" ]; then
344
+ OBSERVER_ENABLED=false
345
+ else
346
+ OBSERVER_ENABLED=false
347
+ CONFIG_FILE="${SKILL_ROOT}/config.json"
348
+ # Allow CLV2_CONFIG override
349
+ if [ -n "${CLV2_CONFIG:-}" ]; then
350
+ CONFIG_FILE="$CLV2_CONFIG"
351
+ fi
352
+ # Use effective config path for both existence check and reading
353
+ EFFECTIVE_CONFIG="$CONFIG_FILE"
354
+ if [ -f "$EFFECTIVE_CONFIG" ] && [ -n "$PYTHON_CMD" ]; then
355
+ _enabled=$(CLV2_CONFIG_PATH="$EFFECTIVE_CONFIG" "$PYTHON_CMD" -c "
356
+ import json, os
357
+ with open(os.environ['CLV2_CONFIG_PATH']) as f:
358
+ cfg = json.load(f)
359
+ print(str(cfg.get('observer', {}).get('enabled', False)).lower())
360
+ " 2>/dev/null || echo "false")
361
+ if [ "$_enabled" = "true" ]; then
362
+ OBSERVER_ENABLED=true
363
+ fi
364
+ fi
365
+ fi
366
+
367
+ # Check both project-scoped AND global PID files (with stale PID recovery)
368
+ if [ "$OBSERVER_ENABLED" = "true" ]; then
369
+ # Clean up stale PID files first
370
+ _CHECK_OBSERVER_RUNNING "${PROJECT_DIR}/.observer.pid" || true
371
+ _CHECK_OBSERVER_RUNNING "${CONFIG_DIR}/.observer.pid" || true
372
+
373
+ # Check if observer is now running after cleanup
374
+ if [ ! -f "${PROJECT_DIR}/.observer.pid" ] && [ ! -f "${CONFIG_DIR}/.observer.pid" ]; then
375
+ # Use flock if available (Linux), fallback for macOS
376
+ if command -v flock >/dev/null 2>&1; then
377
+ (
378
+ flock -n 9 || exit 0
379
+ # Double-check PID files after acquiring lock
380
+ _CHECK_OBSERVER_RUNNING "${PROJECT_DIR}/.observer.pid" || true
381
+ _CHECK_OBSERVER_RUNNING "${CONFIG_DIR}/.observer.pid" || true
382
+ if [ ! -f "${PROJECT_DIR}/.observer.pid" ] && [ ! -f "${CONFIG_DIR}/.observer.pid" ]; then
383
+ nohup "${SKILL_ROOT}/agents/start-observer.sh" start >/dev/null 2>&1 &
384
+ fi
385
+ ) 9>"$LAZY_START_LOCK"
386
+ else
387
+ # macOS fallback: use lockfile if available, otherwise mkdir-based lock
388
+ if command -v lockfile >/dev/null 2>&1; then
389
+ # Use subshell to isolate exit and add trap for cleanup
390
+ (
391
+ trap 'rm -f "$LAZY_START_LOCK" 2>/dev/null || true' EXIT
392
+ lockfile -r 1 -l 30 "$LAZY_START_LOCK" 2>/dev/null || exit 0
393
+ _CHECK_OBSERVER_RUNNING "${PROJECT_DIR}/.observer.pid" || true
394
+ _CHECK_OBSERVER_RUNNING "${CONFIG_DIR}/.observer.pid" || true
395
+ if [ ! -f "${PROJECT_DIR}/.observer.pid" ] && [ ! -f "${CONFIG_DIR}/.observer.pid" ]; then
396
+ nohup "${SKILL_ROOT}/agents/start-observer.sh" start >/dev/null 2>&1 &
397
+ fi
398
+ rm -f "$LAZY_START_LOCK" 2>/dev/null || true
399
+ )
400
+ else
401
+ # POSIX fallback: mkdir is atomic -- fails if dir already exists
402
+ (
403
+ trap 'rmdir "${LAZY_START_LOCK}.d" 2>/dev/null || true' EXIT
404
+ mkdir "${LAZY_START_LOCK}.d" 2>/dev/null || exit 0
405
+ _CHECK_OBSERVER_RUNNING "${PROJECT_DIR}/.observer.pid" || true
406
+ _CHECK_OBSERVER_RUNNING "${CONFIG_DIR}/.observer.pid" || true
407
+ if [ ! -f "${PROJECT_DIR}/.observer.pid" ] && [ ! -f "${CONFIG_DIR}/.observer.pid" ]; then
408
+ nohup "${SKILL_ROOT}/agents/start-observer.sh" start >/dev/null 2>&1 &
409
+ fi
410
+ )
411
+ fi
412
+ fi
413
+ fi
414
+ fi
415
+
416
+ # Throttle SIGUSR1: only signal observer every N observations (#521)
417
+ # This prevents rapid signaling when tool calls fire every second,
418
+ # which caused runaway parallel Claude analysis processes.
419
+ SIGNAL_EVERY_N="${ECC_OBSERVER_SIGNAL_EVERY_N:-20}"
420
+ SIGNAL_COUNTER_FILE="${PROJECT_DIR}/.observer-signal-counter"
421
+ ACTIVITY_FILE="${PROJECT_DIR}/.observer-last-activity"
422
+
423
+ touch "$ACTIVITY_FILE" 2>/dev/null || true
424
+
425
+ should_signal=0
426
+ if [ -f "$SIGNAL_COUNTER_FILE" ]; then
427
+ counter=$(cat "$SIGNAL_COUNTER_FILE" 2>/dev/null || echo 0)
428
+ counter=$((counter + 1))
429
+ if [ "$counter" -ge "$SIGNAL_EVERY_N" ]; then
430
+ should_signal=1
431
+ counter=0
432
+ fi
433
+ echo "$counter" > "$SIGNAL_COUNTER_FILE"
434
+ else
435
+ echo "1" > "$SIGNAL_COUNTER_FILE"
436
+ fi
437
+
438
+ # Signal observer if running and throttle allows (check both project-scoped and global observer, deduplicate)
439
+ if [ "$should_signal" -eq 1 ]; then
440
+ signaled_pids=" "
441
+ for pid_file in "${PROJECT_DIR}/.observer.pid" "${CONFIG_DIR}/.observer.pid"; do
442
+ if [ -f "$pid_file" ]; then
443
+ observer_pid=$(cat "$pid_file" 2>/dev/null || true)
444
+ # Validate PID is a positive integer (>1)
445
+ case "$observer_pid" in
446
+ ''|*[!0-9]*|0|1) rm -f "$pid_file" 2>/dev/null || true; continue ;;
447
+ esac
448
+ # Deduplicate: skip if already signaled this pass
449
+ case "$signaled_pids" in
450
+ *" $observer_pid "*) continue ;;
451
+ esac
452
+ if kill -0 "$observer_pid" 2>/dev/null; then
453
+ kill -USR1 "$observer_pid" 2>/dev/null || true
454
+ signaled_pids="${signaled_pids}${observer_pid} "
455
+ fi
456
+ fi
457
+ done
458
+ fi
459
+
460
+ exit 0