claudecode-omc 5.5.2 → 5.6.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (438) hide show
  1. package/.local/skills/de-ai-writing/SKILL.md +243 -0
  2. package/.local/skills/de-ai-writing/references/chinese-patterns.md +152 -0
  3. package/.local/skills/de-ai-writing/references/chinese-signals.md +121 -0
  4. package/.local/skills/de-ai-writing/references/domain-playbooks.md +120 -0
  5. package/.local/skills/de-ai-writing/references/wikipedia-signs.md +196 -0
  6. package/README.md +102 -10
  7. package/bundled/manifest.json +3 -2
  8. package/bundled/upstream/ecc/.omc-source/bundle.json +23 -0
  9. package/bundled/upstream/ecc/.omc-source/last-plan-apply.json +439 -0
  10. package/bundled/upstream/ecc/.omc-source/manifests/.claude-plugin/marketplace.json +47 -0
  11. package/bundled/upstream/ecc/agents/a11y-architect.md +141 -0
  12. package/bundled/upstream/ecc/agents/architect.md +211 -0
  13. package/bundled/upstream/ecc/agents/build-error-resolver.md +114 -0
  14. package/bundled/upstream/ecc/agents/chief-of-staff.md +151 -0
  15. package/bundled/upstream/ecc/agents/code-architect.md +71 -0
  16. package/bundled/upstream/ecc/agents/code-explorer.md +69 -0
  17. package/bundled/upstream/ecc/agents/code-reviewer.md +237 -0
  18. package/bundled/upstream/ecc/agents/code-simplifier.md +47 -0
  19. package/bundled/upstream/ecc/agents/comment-analyzer.md +45 -0
  20. package/bundled/upstream/ecc/agents/conversation-analyzer.md +52 -0
  21. package/bundled/upstream/ecc/agents/cpp-build-resolver.md +90 -0
  22. package/bundled/upstream/ecc/agents/cpp-reviewer.md +72 -0
  23. package/bundled/upstream/ecc/agents/csharp-reviewer.md +101 -0
  24. package/bundled/upstream/ecc/agents/dart-build-resolver.md +201 -0
  25. package/bundled/upstream/ecc/agents/database-reviewer.md +91 -0
  26. package/bundled/upstream/ecc/agents/doc-updater.md +107 -0
  27. package/bundled/upstream/ecc/agents/docs-lookup.md +68 -0
  28. package/bundled/upstream/ecc/agents/e2e-runner.md +107 -0
  29. package/bundled/upstream/ecc/agents/flutter-reviewer.md +243 -0
  30. package/bundled/upstream/ecc/agents/gan-evaluator.md +209 -0
  31. package/bundled/upstream/ecc/agents/gan-generator.md +131 -0
  32. package/bundled/upstream/ecc/agents/gan-planner.md +99 -0
  33. package/bundled/upstream/ecc/agents/go-build-resolver.md +94 -0
  34. package/bundled/upstream/ecc/agents/go-reviewer.md +76 -0
  35. package/bundled/upstream/ecc/agents/harness-optimizer.md +35 -0
  36. package/bundled/upstream/ecc/agents/healthcare-reviewer.md +83 -0
  37. package/bundled/upstream/ecc/agents/java-build-resolver.md +153 -0
  38. package/bundled/upstream/ecc/agents/java-reviewer.md +92 -0
  39. package/bundled/upstream/ecc/agents/kotlin-build-resolver.md +118 -0
  40. package/bundled/upstream/ecc/agents/kotlin-reviewer.md +159 -0
  41. package/bundled/upstream/ecc/agents/loop-operator.md +36 -0
  42. package/bundled/upstream/ecc/agents/opensource-forker.md +198 -0
  43. package/bundled/upstream/ecc/agents/opensource-packager.md +249 -0
  44. package/bundled/upstream/ecc/agents/opensource-sanitizer.md +188 -0
  45. package/bundled/upstream/ecc/agents/performance-optimizer.md +446 -0
  46. package/bundled/upstream/ecc/agents/planner.md +212 -0
  47. package/bundled/upstream/ecc/agents/pr-test-analyzer.md +45 -0
  48. package/bundled/upstream/ecc/agents/python-reviewer.md +98 -0
  49. package/bundled/upstream/ecc/agents/pytorch-build-resolver.md +120 -0
  50. package/bundled/upstream/ecc/agents/refactor-cleaner.md +85 -0
  51. package/bundled/upstream/ecc/agents/rust-build-resolver.md +148 -0
  52. package/bundled/upstream/ecc/agents/rust-reviewer.md +94 -0
  53. package/bundled/upstream/ecc/agents/security-reviewer.md +108 -0
  54. package/bundled/upstream/ecc/agents/seo-specialist.md +62 -0
  55. package/bundled/upstream/ecc/agents/silent-failure-hunter.md +50 -0
  56. package/bundled/upstream/ecc/agents/tdd-guide.md +91 -0
  57. package/bundled/upstream/ecc/agents/type-design-analyzer.md +41 -0
  58. package/bundled/upstream/ecc/agents/typescript-reviewer.md +112 -0
  59. package/bundled/upstream/ecc/commands/agent-sort.md +23 -0
  60. package/bundled/upstream/ecc/commands/aside.md +164 -0
  61. package/bundled/upstream/ecc/commands/build-fix.md +62 -0
  62. package/bundled/upstream/ecc/commands/checkpoint.md +74 -0
  63. package/bundled/upstream/ecc/commands/claw.md +23 -0
  64. package/bundled/upstream/ecc/commands/code-review.md +289 -0
  65. package/bundled/upstream/ecc/commands/context-budget.md +23 -0
  66. package/bundled/upstream/ecc/commands/cpp-build.md +173 -0
  67. package/bundled/upstream/ecc/commands/cpp-review.md +132 -0
  68. package/bundled/upstream/ecc/commands/cpp-test.md +251 -0
  69. package/bundled/upstream/ecc/commands/devfleet.md +23 -0
  70. package/bundled/upstream/ecc/commands/docs.md +23 -0
  71. package/bundled/upstream/ecc/commands/e2e.md +268 -0
  72. package/bundled/upstream/ecc/commands/eval.md +23 -0
  73. package/bundled/upstream/ecc/commands/evolve.md +178 -0
  74. package/bundled/upstream/ecc/commands/feature-dev.md +49 -0
  75. package/bundled/upstream/ecc/commands/flutter-build.md +164 -0
  76. package/bundled/upstream/ecc/commands/flutter-review.md +116 -0
  77. package/bundled/upstream/ecc/commands/flutter-test.md +144 -0
  78. package/bundled/upstream/ecc/commands/gan-build.md +99 -0
  79. package/bundled/upstream/ecc/commands/gan-design.md +35 -0
  80. package/bundled/upstream/ecc/commands/go-build.md +183 -0
  81. package/bundled/upstream/ecc/commands/go-review.md +148 -0
  82. package/bundled/upstream/ecc/commands/go-test.md +268 -0
  83. package/bundled/upstream/ecc/commands/gradle-build.md +70 -0
  84. package/bundled/upstream/ecc/commands/harness-audit.md +73 -0
  85. package/bundled/upstream/ecc/commands/hookify-configure.md +14 -0
  86. package/bundled/upstream/ecc/commands/hookify-help.md +46 -0
  87. package/bundled/upstream/ecc/commands/hookify-list.md +21 -0
  88. package/bundled/upstream/ecc/commands/hookify.md +50 -0
  89. package/bundled/upstream/ecc/commands/instinct-export.md +66 -0
  90. package/bundled/upstream/ecc/commands/instinct-import.md +114 -0
  91. package/bundled/upstream/ecc/commands/instinct-status.md +59 -0
  92. package/bundled/upstream/ecc/commands/jira.md +106 -0
  93. package/bundled/upstream/ecc/commands/kotlin-build.md +174 -0
  94. package/bundled/upstream/ecc/commands/kotlin-review.md +140 -0
  95. package/bundled/upstream/ecc/commands/kotlin-test.md +312 -0
  96. package/bundled/upstream/ecc/commands/learn-eval.md +116 -0
  97. package/bundled/upstream/ecc/commands/learn.md +70 -0
  98. package/bundled/upstream/ecc/commands/loop-start.md +32 -0
  99. package/bundled/upstream/ecc/commands/loop-status.md +24 -0
  100. package/bundled/upstream/ecc/commands/model-route.md +26 -0
  101. package/bundled/upstream/ecc/commands/multi-backend.md +158 -0
  102. package/bundled/upstream/ecc/commands/multi-execute.md +315 -0
  103. package/bundled/upstream/ecc/commands/multi-frontend.md +158 -0
  104. package/bundled/upstream/ecc/commands/multi-plan.md +268 -0
  105. package/bundled/upstream/ecc/commands/multi-workflow.md +191 -0
  106. package/bundled/upstream/ecc/commands/orchestrate.md +135 -0
  107. package/bundled/upstream/ecc/commands/plan.md +117 -0
  108. package/bundled/upstream/ecc/commands/pm2.md +272 -0
  109. package/bundled/upstream/ecc/commands/projects.md +39 -0
  110. package/bundled/upstream/ecc/commands/promote.md +41 -0
  111. package/bundled/upstream/ecc/commands/prompt-optimize.md +23 -0
  112. package/bundled/upstream/ecc/commands/prp-commit.md +112 -0
  113. package/bundled/upstream/ecc/commands/prp-implement.md +385 -0
  114. package/bundled/upstream/ecc/commands/prp-plan.md +502 -0
  115. package/bundled/upstream/ecc/commands/prp-pr.md +184 -0
  116. package/bundled/upstream/ecc/commands/prp-prd.md +447 -0
  117. package/bundled/upstream/ecc/commands/prune.md +31 -0
  118. package/bundled/upstream/ecc/commands/python-review.md +297 -0
  119. package/bundled/upstream/ecc/commands/quality-gate.md +29 -0
  120. package/bundled/upstream/ecc/commands/refactor-clean.md +80 -0
  121. package/bundled/upstream/ecc/commands/resume-session.md +156 -0
  122. package/bundled/upstream/ecc/commands/review-pr.md +37 -0
  123. package/bundled/upstream/ecc/commands/rules-distill.md +20 -0
  124. package/bundled/upstream/ecc/commands/rust-build.md +187 -0
  125. package/bundled/upstream/ecc/commands/rust-review.md +142 -0
  126. package/bundled/upstream/ecc/commands/rust-test.md +308 -0
  127. package/bundled/upstream/ecc/commands/santa-loop.md +175 -0
  128. package/bundled/upstream/ecc/commands/save-session.md +275 -0
  129. package/bundled/upstream/ecc/commands/sessions.md +339 -0
  130. package/bundled/upstream/ecc/commands/setup-pm.md +80 -0
  131. package/bundled/upstream/ecc/commands/skill-create.md +174 -0
  132. package/bundled/upstream/ecc/commands/skill-health.md +54 -0
  133. package/bundled/upstream/ecc/commands/tdd.md +231 -0
  134. package/bundled/upstream/ecc/commands/test-coverage.md +69 -0
  135. package/bundled/upstream/ecc/commands/update-codemaps.md +72 -0
  136. package/bundled/upstream/ecc/commands/update-docs.md +84 -0
  137. package/bundled/upstream/ecc/commands/verify.md +23 -0
  138. package/bundled/upstream/ecc/hooks/README.md +237 -0
  139. package/bundled/upstream/ecc/hooks/hooks.json +330 -0
  140. package/bundled/upstream/ecc/skills/accessibility/SKILL.md +146 -0
  141. package/bundled/upstream/ecc/skills/agent-eval/SKILL.md +145 -0
  142. package/bundled/upstream/ecc/skills/agent-harness-construction/SKILL.md +73 -0
  143. package/bundled/upstream/ecc/skills/agent-introspection-debugging/SKILL.md +153 -0
  144. package/bundled/upstream/ecc/skills/agent-payment-x402/SKILL.md +178 -0
  145. package/bundled/upstream/ecc/skills/agent-sort/SKILL.md +215 -0
  146. package/bundled/upstream/ecc/skills/agentic-engineering/SKILL.md +63 -0
  147. package/bundled/upstream/ecc/skills/ai-first-engineering/SKILL.md +51 -0
  148. package/bundled/upstream/ecc/skills/ai-regression-testing/SKILL.md +385 -0
  149. package/bundled/upstream/ecc/skills/android-clean-architecture/SKILL.md +339 -0
  150. package/bundled/upstream/ecc/skills/api-connector-builder/SKILL.md +120 -0
  151. package/bundled/upstream/ecc/skills/api-design/SKILL.md +523 -0
  152. package/bundled/upstream/ecc/skills/architecture-decision-records/SKILL.md +179 -0
  153. package/bundled/upstream/ecc/skills/article-writing/SKILL.md +79 -0
  154. package/bundled/upstream/ecc/skills/automation-audit-ops/SKILL.md +142 -0
  155. package/bundled/upstream/ecc/skills/autonomous-agent-harness/SKILL.md +267 -0
  156. package/bundled/upstream/ecc/skills/autonomous-loops/SKILL.md +610 -0
  157. package/bundled/upstream/ecc/skills/backend-patterns/SKILL.md +598 -0
  158. package/bundled/upstream/ecc/skills/benchmark/SKILL.md +93 -0
  159. package/bundled/upstream/ecc/skills/blueprint/SKILL.md +105 -0
  160. package/bundled/upstream/ecc/skills/brand-voice/SKILL.md +97 -0
  161. package/bundled/upstream/ecc/skills/brand-voice/references/voice-profile-schema.md +55 -0
  162. package/bundled/upstream/ecc/skills/browser-qa/SKILL.md +87 -0
  163. package/bundled/upstream/ecc/skills/bun-runtime/SKILL.md +84 -0
  164. package/bundled/upstream/ecc/skills/canary-watch/SKILL.md +99 -0
  165. package/bundled/upstream/ecc/skills/carrier-relationship-management/SKILL.md +212 -0
  166. package/bundled/upstream/ecc/skills/ck/SKILL.md +147 -0
  167. package/bundled/upstream/ecc/skills/ck/commands/forget.mjs +44 -0
  168. package/bundled/upstream/ecc/skills/ck/commands/info.mjs +24 -0
  169. package/bundled/upstream/ecc/skills/ck/commands/init.mjs +143 -0
  170. package/bundled/upstream/ecc/skills/ck/commands/list.mjs +40 -0
  171. package/bundled/upstream/ecc/skills/ck/commands/migrate.mjs +202 -0
  172. package/bundled/upstream/ecc/skills/ck/commands/resume.mjs +36 -0
  173. package/bundled/upstream/ecc/skills/ck/commands/save.mjs +210 -0
  174. package/bundled/upstream/ecc/skills/ck/commands/shared.mjs +387 -0
  175. package/bundled/upstream/ecc/skills/ck/hooks/session-start.mjs +224 -0
  176. package/bundled/upstream/ecc/skills/claude-api/SKILL.md +337 -0
  177. package/bundled/upstream/ecc/skills/claude-devfleet/SKILL.md +103 -0
  178. package/bundled/upstream/ecc/skills/click-path-audit/SKILL.md +244 -0
  179. package/bundled/upstream/ecc/skills/clickhouse-io/SKILL.md +439 -0
  180. package/bundled/upstream/ecc/skills/code-tour/SKILL.md +236 -0
  181. package/bundled/upstream/ecc/skills/codebase-onboarding/SKILL.md +233 -0
  182. package/bundled/upstream/ecc/skills/coding-standards/SKILL.md +549 -0
  183. package/bundled/upstream/ecc/skills/compose-multiplatform-patterns/SKILL.md +299 -0
  184. package/bundled/upstream/ecc/skills/configure-ecc/SKILL.md +367 -0
  185. package/bundled/upstream/ecc/skills/connections-optimizer/SKILL.md +189 -0
  186. package/bundled/upstream/ecc/skills/content-engine/SKILL.md +131 -0
  187. package/bundled/upstream/ecc/skills/content-hash-cache-pattern/SKILL.md +161 -0
  188. package/bundled/upstream/ecc/skills/context-budget/SKILL.md +135 -0
  189. package/bundled/upstream/ecc/skills/continuous-agent-loop/SKILL.md +45 -0
  190. package/bundled/upstream/ecc/skills/continuous-learning/SKILL.md +123 -0
  191. package/bundled/upstream/ecc/skills/continuous-learning/config.json +18 -0
  192. package/bundled/upstream/ecc/skills/continuous-learning/evaluate-session.sh +69 -0
  193. package/bundled/upstream/ecc/skills/continuous-learning-v2/SKILL.md +346 -0
  194. package/bundled/upstream/ecc/skills/continuous-learning-v2/agents/observer-loop.sh +282 -0
  195. package/bundled/upstream/ecc/skills/continuous-learning-v2/agents/observer.md +198 -0
  196. package/bundled/upstream/ecc/skills/continuous-learning-v2/agents/session-guardian.sh +150 -0
  197. package/bundled/upstream/ecc/skills/continuous-learning-v2/agents/start-observer.sh +244 -0
  198. package/bundled/upstream/ecc/skills/continuous-learning-v2/config.json +8 -0
  199. package/bundled/upstream/ecc/skills/continuous-learning-v2/hooks/observe.sh +460 -0
  200. package/bundled/upstream/ecc/skills/continuous-learning-v2/scripts/detect-project.sh +243 -0
  201. package/bundled/upstream/ecc/skills/continuous-learning-v2/scripts/instinct-cli.py +1426 -0
  202. package/bundled/upstream/ecc/skills/continuous-learning-v2/scripts/test_parse_instinct.py +984 -0
  203. package/bundled/upstream/ecc/skills/cost-aware-llm-pipeline/SKILL.md +183 -0
  204. package/bundled/upstream/ecc/skills/council/SKILL.md +203 -0
  205. package/bundled/upstream/ecc/skills/cpp-coding-standards/SKILL.md +723 -0
  206. package/bundled/upstream/ecc/skills/cpp-testing/SKILL.md +324 -0
  207. package/bundled/upstream/ecc/skills/crosspost/SKILL.md +111 -0
  208. package/bundled/upstream/ecc/skills/csharp-testing/SKILL.md +321 -0
  209. package/bundled/upstream/ecc/skills/customer-billing-ops/SKILL.md +140 -0
  210. package/bundled/upstream/ecc/skills/customs-trade-compliance/SKILL.md +263 -0
  211. package/bundled/upstream/ecc/skills/dart-flutter-patterns/SKILL.md +563 -0
  212. package/bundled/upstream/ecc/skills/dashboard-builder/SKILL.md +108 -0
  213. package/bundled/upstream/ecc/skills/data-scraper-agent/SKILL.md +764 -0
  214. package/bundled/upstream/ecc/skills/database-migrations/SKILL.md +429 -0
  215. package/bundled/upstream/ecc/skills/deep-research/SKILL.md +155 -0
  216. package/bundled/upstream/ecc/skills/defi-amm-security/SKILL.md +160 -0
  217. package/bundled/upstream/ecc/skills/deployment-patterns/SKILL.md +427 -0
  218. package/bundled/upstream/ecc/skills/design-system/SKILL.md +82 -0
  219. package/bundled/upstream/ecc/skills/django-patterns/SKILL.md +734 -0
  220. package/bundled/upstream/ecc/skills/django-security/SKILL.md +593 -0
  221. package/bundled/upstream/ecc/skills/django-tdd/SKILL.md +729 -0
  222. package/bundled/upstream/ecc/skills/django-verification/SKILL.md +469 -0
  223. package/bundled/upstream/ecc/skills/dmux-workflows/SKILL.md +191 -0
  224. package/bundled/upstream/ecc/skills/docker-patterns/SKILL.md +364 -0
  225. package/bundled/upstream/ecc/skills/documentation-lookup/SKILL.md +90 -0
  226. package/bundled/upstream/ecc/skills/dotnet-patterns/SKILL.md +321 -0
  227. package/bundled/upstream/ecc/skills/e2e-testing/SKILL.md +326 -0
  228. package/bundled/upstream/ecc/skills/ecc-tools-cost-audit/SKILL.md +160 -0
  229. package/bundled/upstream/ecc/skills/email-ops/SKILL.md +121 -0
  230. package/bundled/upstream/ecc/skills/energy-procurement/SKILL.md +228 -0
  231. package/bundled/upstream/ecc/skills/enterprise-agent-ops/SKILL.md +50 -0
  232. package/bundled/upstream/ecc/skills/eval-harness/SKILL.md +270 -0
  233. package/bundled/upstream/ecc/skills/evm-token-decimals/SKILL.md +130 -0
  234. package/bundled/upstream/ecc/skills/exa-search/SKILL.md +103 -0
  235. package/bundled/upstream/ecc/skills/fal-ai-media/SKILL.md +284 -0
  236. package/bundled/upstream/ecc/skills/finance-billing-ops/SKILL.md +127 -0
  237. package/bundled/upstream/ecc/skills/flutter-dart-code-review/SKILL.md +435 -0
  238. package/bundled/upstream/ecc/skills/foundation-models-on-device/SKILL.md +243 -0
  239. package/bundled/upstream/ecc/skills/frontend-design/SKILL.md +145 -0
  240. package/bundled/upstream/ecc/skills/frontend-patterns/SKILL.md +642 -0
  241. package/bundled/upstream/ecc/skills/frontend-slides/SKILL.md +184 -0
  242. package/bundled/upstream/ecc/skills/frontend-slides/STYLE_PRESETS.md +330 -0
  243. package/bundled/upstream/ecc/skills/gan-style-harness/SKILL.md +278 -0
  244. package/bundled/upstream/ecc/skills/gateguard/SKILL.md +121 -0
  245. package/bundled/upstream/ecc/skills/git-workflow/SKILL.md +715 -0
  246. package/bundled/upstream/ecc/skills/github-ops/SKILL.md +144 -0
  247. package/bundled/upstream/ecc/skills/golang-patterns/SKILL.md +674 -0
  248. package/bundled/upstream/ecc/skills/golang-testing/SKILL.md +720 -0
  249. package/bundled/upstream/ecc/skills/google-workspace-ops/SKILL.md +95 -0
  250. package/bundled/upstream/ecc/skills/healthcare-cdss-patterns/SKILL.md +245 -0
  251. package/bundled/upstream/ecc/skills/healthcare-emr-patterns/SKILL.md +159 -0
  252. package/bundled/upstream/ecc/skills/healthcare-eval-harness/SKILL.md +207 -0
  253. package/bundled/upstream/ecc/skills/healthcare-phi-compliance/SKILL.md +145 -0
  254. package/bundled/upstream/ecc/skills/hexagonal-architecture/SKILL.md +276 -0
  255. package/bundled/upstream/ecc/skills/hipaa-compliance/SKILL.md +78 -0
  256. package/bundled/upstream/ecc/skills/hookify-rules/SKILL.md +128 -0
  257. package/bundled/upstream/ecc/skills/inventory-demand-planning/SKILL.md +247 -0
  258. package/bundled/upstream/ecc/skills/investor-materials/SKILL.md +96 -0
  259. package/bundled/upstream/ecc/skills/investor-outreach/SKILL.md +91 -0
  260. package/bundled/upstream/ecc/skills/iterative-retrieval/SKILL.md +211 -0
  261. package/bundled/upstream/ecc/skills/java-coding-standards/SKILL.md +147 -0
  262. package/bundled/upstream/ecc/skills/jira-integration/SKILL.md +293 -0
  263. package/bundled/upstream/ecc/skills/jpa-patterns/SKILL.md +151 -0
  264. package/bundled/upstream/ecc/skills/knowledge-ops/SKILL.md +154 -0
  265. package/bundled/upstream/ecc/skills/kotlin-coroutines-flows/SKILL.md +284 -0
  266. package/bundled/upstream/ecc/skills/kotlin-exposed-patterns/SKILL.md +719 -0
  267. package/bundled/upstream/ecc/skills/kotlin-ktor-patterns/SKILL.md +689 -0
  268. package/bundled/upstream/ecc/skills/kotlin-patterns/SKILL.md +711 -0
  269. package/bundled/upstream/ecc/skills/kotlin-testing/SKILL.md +824 -0
  270. package/bundled/upstream/ecc/skills/laravel-patterns/SKILL.md +415 -0
  271. package/bundled/upstream/ecc/skills/laravel-plugin-discovery/SKILL.md +229 -0
  272. package/bundled/upstream/ecc/skills/laravel-security/SKILL.md +285 -0
  273. package/bundled/upstream/ecc/skills/laravel-tdd/SKILL.md +283 -0
  274. package/bundled/upstream/ecc/skills/laravel-verification/SKILL.md +179 -0
  275. package/bundled/upstream/ecc/skills/lead-intelligence/SKILL.md +321 -0
  276. package/bundled/upstream/ecc/skills/lead-intelligence/agents/enrichment-agent.md +85 -0
  277. package/bundled/upstream/ecc/skills/lead-intelligence/agents/mutual-mapper.md +75 -0
  278. package/bundled/upstream/ecc/skills/lead-intelligence/agents/outreach-drafter.md +98 -0
  279. package/bundled/upstream/ecc/skills/lead-intelligence/agents/signal-scorer.md +60 -0
  280. package/bundled/upstream/ecc/skills/liquid-glass-design/SKILL.md +279 -0
  281. package/bundled/upstream/ecc/skills/llm-trading-agent-security/SKILL.md +146 -0
  282. package/bundled/upstream/ecc/skills/logistics-exception-management/SKILL.md +222 -0
  283. package/bundled/upstream/ecc/skills/manim-video/SKILL.md +89 -0
  284. package/bundled/upstream/ecc/skills/manim-video/assets/network_graph_scene.py +52 -0
  285. package/bundled/upstream/ecc/skills/market-research/SKILL.md +75 -0
  286. package/bundled/upstream/ecc/skills/mcp-server-patterns/SKILL.md +69 -0
  287. package/bundled/upstream/ecc/skills/messages-ops/SKILL.md +104 -0
  288. package/bundled/upstream/ecc/skills/nanoclaw-repl/SKILL.md +33 -0
  289. package/bundled/upstream/ecc/skills/nestjs-patterns/SKILL.md +230 -0
  290. package/bundled/upstream/ecc/skills/nextjs-turbopack/SKILL.md +44 -0
  291. package/bundled/upstream/ecc/skills/nodejs-keccak256/SKILL.md +102 -0
  292. package/bundled/upstream/ecc/skills/nutrient-document-processing/SKILL.md +167 -0
  293. package/bundled/upstream/ecc/skills/nuxt4-patterns/SKILL.md +100 -0
  294. package/bundled/upstream/ecc/skills/openclaw-persona-forge/SKILL.md +296 -0
  295. package/bundled/upstream/ecc/skills/openclaw-persona-forge/gacha.py +224 -0
  296. package/bundled/upstream/ecc/skills/openclaw-persona-forge/gacha.sh +5 -0
  297. package/bundled/upstream/ecc/skills/openclaw-persona-forge/references/avatar-style.md +124 -0
  298. package/bundled/upstream/ecc/skills/openclaw-persona-forge/references/boundary-rules.md +53 -0
  299. package/bundled/upstream/ecc/skills/openclaw-persona-forge/references/error-handling.md +53 -0
  300. package/bundled/upstream/ecc/skills/openclaw-persona-forge/references/identity-tension.md +48 -0
  301. package/bundled/upstream/ecc/skills/openclaw-persona-forge/references/naming-system.md +39 -0
  302. package/bundled/upstream/ecc/skills/openclaw-persona-forge/references/output-template.md +166 -0
  303. package/bundled/upstream/ecc/skills/opensource-pipeline/SKILL.md +255 -0
  304. package/bundled/upstream/ecc/skills/perl-patterns/SKILL.md +504 -0
  305. package/bundled/upstream/ecc/skills/perl-security/SKILL.md +503 -0
  306. package/bundled/upstream/ecc/skills/perl-testing/SKILL.md +475 -0
  307. package/bundled/upstream/ecc/skills/plankton-code-quality/SKILL.md +236 -0
  308. package/bundled/upstream/ecc/skills/postgres-patterns/SKILL.md +147 -0
  309. package/bundled/upstream/ecc/skills/product-capability/SKILL.md +141 -0
  310. package/bundled/upstream/ecc/skills/product-lens/SKILL.md +92 -0
  311. package/bundled/upstream/ecc/skills/production-scheduling/SKILL.md +238 -0
  312. package/bundled/upstream/ecc/skills/project-flow-ops/SKILL.md +111 -0
  313. package/bundled/upstream/ecc/skills/prompt-optimizer/SKILL.md +397 -0
  314. package/bundled/upstream/ecc/skills/python-patterns/SKILL.md +750 -0
  315. package/bundled/upstream/ecc/skills/python-testing/SKILL.md +816 -0
  316. package/bundled/upstream/ecc/skills/pytorch-patterns/SKILL.md +396 -0
  317. package/bundled/upstream/ecc/skills/quality-nonconformance/SKILL.md +260 -0
  318. package/bundled/upstream/ecc/skills/ralphinho-rfc-pipeline/SKILL.md +67 -0
  319. package/bundled/upstream/ecc/skills/regex-vs-llm-structured-text/SKILL.md +220 -0
  320. package/bundled/upstream/ecc/skills/remotion-video-creation/SKILL.md +43 -0
  321. package/bundled/upstream/ecc/skills/remotion-video-creation/rules/3d.md +86 -0
  322. package/bundled/upstream/ecc/skills/remotion-video-creation/rules/animations.md +29 -0
  323. package/bundled/upstream/ecc/skills/remotion-video-creation/rules/assets/charts-bar-chart.tsx +173 -0
  324. package/bundled/upstream/ecc/skills/remotion-video-creation/rules/assets/text-animations-typewriter.tsx +100 -0
  325. package/bundled/upstream/ecc/skills/remotion-video-creation/rules/assets/text-animations-word-highlight.tsx +108 -0
  326. package/bundled/upstream/ecc/skills/remotion-video-creation/rules/assets.md +78 -0
  327. package/bundled/upstream/ecc/skills/remotion-video-creation/rules/audio.md +172 -0
  328. package/bundled/upstream/ecc/skills/remotion-video-creation/rules/calculate-metadata.md +104 -0
  329. package/bundled/upstream/ecc/skills/remotion-video-creation/rules/can-decode.md +75 -0
  330. package/bundled/upstream/ecc/skills/remotion-video-creation/rules/charts.md +58 -0
  331. package/bundled/upstream/ecc/skills/remotion-video-creation/rules/compositions.md +146 -0
  332. package/bundled/upstream/ecc/skills/remotion-video-creation/rules/display-captions.md +126 -0
  333. package/bundled/upstream/ecc/skills/remotion-video-creation/rules/extract-frames.md +229 -0
  334. package/bundled/upstream/ecc/skills/remotion-video-creation/rules/fonts.md +152 -0
  335. package/bundled/upstream/ecc/skills/remotion-video-creation/rules/get-audio-duration.md +58 -0
  336. package/bundled/upstream/ecc/skills/remotion-video-creation/rules/get-video-dimensions.md +68 -0
  337. package/bundled/upstream/ecc/skills/remotion-video-creation/rules/get-video-duration.md +58 -0
  338. package/bundled/upstream/ecc/skills/remotion-video-creation/rules/gifs.md +138 -0
  339. package/bundled/upstream/ecc/skills/remotion-video-creation/rules/images.md +130 -0
  340. package/bundled/upstream/ecc/skills/remotion-video-creation/rules/import-srt-captions.md +67 -0
  341. package/bundled/upstream/ecc/skills/remotion-video-creation/rules/lottie.md +67 -0
  342. package/bundled/upstream/ecc/skills/remotion-video-creation/rules/measuring-dom-nodes.md +34 -0
  343. package/bundled/upstream/ecc/skills/remotion-video-creation/rules/measuring-text.md +143 -0
  344. package/bundled/upstream/ecc/skills/remotion-video-creation/rules/sequencing.md +106 -0
  345. package/bundled/upstream/ecc/skills/remotion-video-creation/rules/tailwind.md +11 -0
  346. package/bundled/upstream/ecc/skills/remotion-video-creation/rules/text-animations.md +20 -0
  347. package/bundled/upstream/ecc/skills/remotion-video-creation/rules/timing.md +179 -0
  348. package/bundled/upstream/ecc/skills/remotion-video-creation/rules/transcribe-captions.md +19 -0
  349. package/bundled/upstream/ecc/skills/remotion-video-creation/rules/transitions.md +122 -0
  350. package/bundled/upstream/ecc/skills/remotion-video-creation/rules/trimming.md +52 -0
  351. package/bundled/upstream/ecc/skills/remotion-video-creation/rules/videos.md +171 -0
  352. package/bundled/upstream/ecc/skills/repo-scan/SKILL.md +78 -0
  353. package/bundled/upstream/ecc/skills/research-ops/SKILL.md +112 -0
  354. package/bundled/upstream/ecc/skills/returns-reverse-logistics/SKILL.md +240 -0
  355. package/bundled/upstream/ecc/skills/rules-distill/SKILL.md +264 -0
  356. package/bundled/upstream/ecc/skills/rules-distill/scripts/scan-rules.sh +58 -0
  357. package/bundled/upstream/ecc/skills/rules-distill/scripts/scan-skills.sh +129 -0
  358. package/bundled/upstream/ecc/skills/rust-patterns/SKILL.md +499 -0
  359. package/bundled/upstream/ecc/skills/rust-testing/SKILL.md +500 -0
  360. package/bundled/upstream/ecc/skills/safety-guard/SKILL.md +75 -0
  361. package/bundled/upstream/ecc/skills/santa-method/SKILL.md +306 -0
  362. package/bundled/upstream/ecc/skills/search-first/SKILL.md +161 -0
  363. package/bundled/upstream/ecc/skills/security-bounty-hunter/SKILL.md +99 -0
  364. package/bundled/upstream/ecc/skills/security-review/SKILL.md +495 -0
  365. package/bundled/upstream/ecc/skills/security-review/cloud-infrastructure-security.md +361 -0
  366. package/bundled/upstream/ecc/skills/security-scan/SKILL.md +165 -0
  367. package/bundled/upstream/ecc/skills/seo/SKILL.md +154 -0
  368. package/bundled/upstream/ecc/skills/skill-comply/SKILL.md +58 -0
  369. package/bundled/upstream/ecc/skills/skill-comply/fixtures/compliant_trace.jsonl +5 -0
  370. package/bundled/upstream/ecc/skills/skill-comply/fixtures/noncompliant_trace.jsonl +3 -0
  371. package/bundled/upstream/ecc/skills/skill-comply/fixtures/tdd_spec.yaml +44 -0
  372. package/bundled/upstream/ecc/skills/skill-comply/prompts/classifier.md +24 -0
  373. package/bundled/upstream/ecc/skills/skill-comply/prompts/scenario_generator.md +62 -0
  374. package/bundled/upstream/ecc/skills/skill-comply/prompts/spec_generator.md +42 -0
  375. package/bundled/upstream/ecc/skills/skill-comply/pyproject.toml +15 -0
  376. package/bundled/upstream/ecc/skills/skill-comply/scripts/__init__.py +0 -0
  377. package/bundled/upstream/ecc/skills/skill-comply/scripts/classifier.py +85 -0
  378. package/bundled/upstream/ecc/skills/skill-comply/scripts/grader.py +124 -0
  379. package/bundled/upstream/ecc/skills/skill-comply/scripts/parser.py +107 -0
  380. package/bundled/upstream/ecc/skills/skill-comply/scripts/report.py +170 -0
  381. package/bundled/upstream/ecc/skills/skill-comply/scripts/run.py +127 -0
  382. package/bundled/upstream/ecc/skills/skill-comply/scripts/runner.py +161 -0
  383. package/bundled/upstream/ecc/skills/skill-comply/scripts/scenario_generator.py +70 -0
  384. package/bundled/upstream/ecc/skills/skill-comply/scripts/spec_generator.py +72 -0
  385. package/bundled/upstream/ecc/skills/skill-comply/scripts/utils.py +13 -0
  386. package/bundled/upstream/ecc/skills/skill-comply/tests/test_grader.py +197 -0
  387. package/bundled/upstream/ecc/skills/skill-comply/tests/test_parser.py +90 -0
  388. package/bundled/upstream/ecc/skills/skill-stocktake/SKILL.md +193 -0
  389. package/bundled/upstream/ecc/skills/skill-stocktake/scripts/quick-diff.sh +87 -0
  390. package/bundled/upstream/ecc/skills/skill-stocktake/scripts/save-results.sh +56 -0
  391. package/bundled/upstream/ecc/skills/skill-stocktake/scripts/scan.sh +170 -0
  392. package/bundled/upstream/ecc/skills/social-graph-ranker/SKILL.md +154 -0
  393. package/bundled/upstream/ecc/skills/springboot-patterns/SKILL.md +314 -0
  394. package/bundled/upstream/ecc/skills/springboot-security/SKILL.md +272 -0
  395. package/bundled/upstream/ecc/skills/springboot-tdd/SKILL.md +158 -0
  396. package/bundled/upstream/ecc/skills/springboot-verification/SKILL.md +231 -0
  397. package/bundled/upstream/ecc/skills/strategic-compact/SKILL.md +131 -0
  398. package/bundled/upstream/ecc/skills/strategic-compact/suggest-compact.sh +54 -0
  399. package/bundled/upstream/ecc/skills/swift-actor-persistence/SKILL.md +143 -0
  400. package/bundled/upstream/ecc/skills/swift-concurrency-6-2/SKILL.md +216 -0
  401. package/bundled/upstream/ecc/skills/swift-protocol-di-testing/SKILL.md +190 -0
  402. package/bundled/upstream/ecc/skills/swiftui-patterns/SKILL.md +259 -0
  403. package/bundled/upstream/ecc/skills/tdd-workflow/SKILL.md +463 -0
  404. package/bundled/upstream/ecc/skills/team-builder/SKILL.md +168 -0
  405. package/bundled/upstream/ecc/skills/terminal-ops/SKILL.md +109 -0
  406. package/bundled/upstream/ecc/skills/token-budget-advisor/SKILL.md +133 -0
  407. package/bundled/upstream/ecc/skills/ui-demo/SKILL.md +465 -0
  408. package/bundled/upstream/ecc/skills/unified-notifications-ops/SKILL.md +187 -0
  409. package/bundled/upstream/ecc/skills/verification-loop/SKILL.md +126 -0
  410. package/bundled/upstream/ecc/skills/video-editing/SKILL.md +310 -0
  411. package/bundled/upstream/ecc/skills/videodb/SKILL.md +374 -0
  412. package/bundled/upstream/ecc/skills/videodb/reference/api-reference.md +550 -0
  413. package/bundled/upstream/ecc/skills/videodb/reference/capture-reference.md +407 -0
  414. package/bundled/upstream/ecc/skills/videodb/reference/capture.md +101 -0
  415. package/bundled/upstream/ecc/skills/videodb/reference/editor.md +443 -0
  416. package/bundled/upstream/ecc/skills/videodb/reference/generative.md +331 -0
  417. package/bundled/upstream/ecc/skills/videodb/reference/rtstream-reference.md +564 -0
  418. package/bundled/upstream/ecc/skills/videodb/reference/rtstream.md +65 -0
  419. package/bundled/upstream/ecc/skills/videodb/reference/search.md +230 -0
  420. package/bundled/upstream/ecc/skills/videodb/reference/streaming.md +406 -0
  421. package/bundled/upstream/ecc/skills/videodb/reference/use-cases.md +118 -0
  422. package/bundled/upstream/ecc/skills/videodb/scripts/ws_listener.py +282 -0
  423. package/bundled/upstream/ecc/skills/visa-doc-translate/README.md +86 -0
  424. package/bundled/upstream/ecc/skills/visa-doc-translate/SKILL.md +117 -0
  425. package/bundled/upstream/ecc/skills/workspace-surface-audit/SKILL.md +125 -0
  426. package/bundled/upstream/ecc/skills/x-api/SKILL.md +230 -0
  427. package/bundled/upstream/superpowers/.omc-source/last-plan-apply.json +22 -0
  428. package/package.json +3 -1
  429. package/src/catalog/source-catalog.js +391 -0
  430. package/src/cli/artifact.js +3 -2
  431. package/src/cli/doctor.js +25 -4
  432. package/src/cli/index.js +19 -0
  433. package/src/cli/plan.js +220 -0
  434. package/src/cli/setup.js +209 -12
  435. package/src/cli/source.js +110 -3
  436. package/src/config/paths.js +31 -0
  437. package/src/config/sources.js +103 -10
  438. package/src/merge/hook-merger.js +1 -0
@@ -0,0 +1,220 @@
1
+ /* eslint-disable no-console */
2
+ const fs = require('fs');
3
+ const fsp = require('fs/promises');
4
+ const path = require('path');
5
+ const { getProjectRoot, getSourceArtifactDir, getSourceMetadataDir } = require('../config/paths');
6
+ const { buildSourceCatalog, buildInstallPlan, deriveSourceActivation } = require('../catalog/source-catalog');
7
+ const { updateSource, readConfig } = require('../config/sources');
8
+
9
+ function findUnsyncedArtifactTypes(sourceName, artifactTypes, root) {
10
+ return (artifactTypes || []).filter((artifactType) => {
11
+ const dir = getSourceArtifactDir(sourceName, artifactType, root);
12
+ if (!fs.existsSync(dir)) return true;
13
+ if (!fs.statSync(dir).isDirectory()) return false;
14
+ return fs.readdirSync(dir).length === 0;
15
+ });
16
+ }
17
+
18
+ async function readSelectionFile(selectionFile) {
19
+ const raw = await fsp.readFile(selectionFile, 'utf8');
20
+ const data = JSON.parse(raw);
21
+ return data && typeof data === 'object' ? data : {};
22
+ }
23
+
24
+ function extractAllowlistFromSelection(planResult, selectionData = {}) {
25
+ const allowlist = {};
26
+ const selectedArtifacts = planResult.actions.filter(action => action.type === 'install-artifact');
27
+ const warnings = [];
28
+
29
+ for (const action of selectedArtifacts) {
30
+ const requested = selectionData[action.artifactType];
31
+ if (!requested) continue;
32
+
33
+ const requestedNames = [...new Set(Array.isArray(requested) ? requested : [])];
34
+ if (requestedNames.length === 0) continue;
35
+
36
+ // Only validate against itemNames when the catalog actually expanded them.
37
+ // Manifest-driven surfaces (e.g. plugin.json) carry only counts, so trust
38
+ // the user's selection and let setup's filterItemsByAllowlist enforce
39
+ // membership against the real on-disk artifact list.
40
+ if (Array.isArray(action.itemNames) && action.itemNames.length > 0) {
41
+ const allowedNames = new Set(action.itemNames);
42
+ const unknown = requestedNames.filter(name => !allowedNames.has(name));
43
+ if (unknown.length > 0) {
44
+ throw new Error(`Unknown ${action.artifactType} selections: ${unknown.join(', ')}`);
45
+ }
46
+ } else {
47
+ warnings.push(`${action.artifactType}: ${requestedNames.length} selections accepted without catalog validation (manifest-driven surface).`);
48
+ }
49
+
50
+ allowlist[action.artifactType] = requestedNames.sort();
51
+ }
52
+
53
+ for (const warning of warnings) {
54
+ console.warn(` warn: ${warning}`);
55
+ }
56
+
57
+ return Object.keys(allowlist).length > 0 ? allowlist : undefined;
58
+ }
59
+
60
+ async function writePlanAudit(sourceName, root, planResult, activation) {
61
+ const metadataDir = getSourceMetadataDir(sourceName, root);
62
+ await fsp.mkdir(metadataDir, { recursive: true });
63
+ const audit = {
64
+ appliedAt: new Date().toISOString(),
65
+ plan: {
66
+ sourceName: planResult.sourceName,
67
+ kind: planResult.kind,
68
+ profile: planResult.profile,
69
+ installMode: planResult.installMode,
70
+ actions: planResult.actions,
71
+ warnings: planResult.warnings,
72
+ },
73
+ activation,
74
+ };
75
+ await fsp.writeFile(path.join(metadataDir, 'last-plan-apply.json'), JSON.stringify(audit, null, 2) + '\n', 'utf8');
76
+ }
77
+
78
+ async function plan(args, flags = {}) {
79
+ const cmd = args[0] || 'install';
80
+
81
+ switch (cmd) {
82
+ case 'install': {
83
+ const sourceName = args[1];
84
+ if (!sourceName) {
85
+ throw new Error('Usage: omc-manage plan install <source> [--profile claude-runtime] [--json]');
86
+ }
87
+
88
+ const profile = flags.profile || 'claude-runtime';
89
+ const catalog = await buildSourceCatalog(sourceName, getProjectRoot());
90
+ const planResult = buildInstallPlan(catalog, profile);
91
+
92
+ if (flags.json) {
93
+ console.log(JSON.stringify(planResult, null, 2));
94
+ return;
95
+ }
96
+
97
+ console.log(`Install Plan: ${sourceName}`);
98
+ console.log('='.repeat(40));
99
+ console.log(`kind: ${planResult.kind}`);
100
+ console.log(`installMode: ${planResult.installMode}`);
101
+ console.log(`profile: ${planResult.profile}`);
102
+ console.log('');
103
+
104
+ console.log('Actions:');
105
+ for (const action of planResult.actions) {
106
+ if (action.type === 'install-artifact') {
107
+ console.log(` install ${action.artifactType} via ${action.adapter} (${action.count} items)`);
108
+ if (action.itemNames && action.itemNames.length > 0) {
109
+ console.log(` curatable: ${action.itemNames.length} names available`);
110
+ }
111
+ } else {
112
+ console.log(` retain ${action.surface} as reference via ${action.adapter || 'n/a'} (${action.count} items)`);
113
+ }
114
+ }
115
+
116
+ console.log('');
117
+ console.log(`Selected surfaces: ${planResult.selectedSurfaces.length}`);
118
+ console.log(`Skipped surfaces: ${planResult.skippedSurfaces.length}`);
119
+
120
+ if (planResult.warnings.length > 0) {
121
+ console.log('');
122
+ console.log('Warnings:');
123
+ for (const warning of planResult.warnings) {
124
+ console.log(` - ${warning}`);
125
+ }
126
+ }
127
+ return;
128
+ }
129
+
130
+ case 'apply': {
131
+ const sourceName = args[1];
132
+ if (!sourceName) {
133
+ throw new Error('Usage: omc-manage plan apply <source> [--profile claude-runtime] [--dry-run] [--json]');
134
+ }
135
+
136
+ const root = getProjectRoot();
137
+ const profile = flags.profile || 'claude-runtime';
138
+ const catalog = await buildSourceCatalog(sourceName, root);
139
+ const planResult = buildInstallPlan(catalog, profile);
140
+ const selectionData = flags.selectionFile ? await readSelectionFile(flags.selectionFile) : {};
141
+ const allowlist = extractAllowlistFromSelection(planResult, selectionData);
142
+ const currentSource = readConfig().sources[sourceName] || {};
143
+ const activation = {
144
+ ...deriveSourceActivation(planResult, currentSource),
145
+ allowlist,
146
+ };
147
+
148
+ if (flags.json) {
149
+ console.log(JSON.stringify({ plan: planResult, activation }, null, 2));
150
+ return;
151
+ }
152
+
153
+ console.log(`Apply Plan: ${sourceName}`);
154
+ console.log('='.repeat(40));
155
+ console.log(`kind: ${planResult.kind}`);
156
+ console.log(`current installMode: ${planResult.installMode}`);
157
+ console.log(`target profile: ${planResult.profile}`);
158
+ console.log(`next installMode: ${activation.installMode}`);
159
+ console.log(`next role: ${activation.role || 'installable'}`);
160
+ console.log(`next artifacts: ${activation.artifacts.join(', ') || '(none)'}`);
161
+ if (activation.allowlist) {
162
+ console.log(`next allowlist: ${Object.entries(activation.allowlist).map(([type, names]) => `${type}(${names.length})`).join(', ')}`);
163
+ }
164
+
165
+ // Warn when activation includes artifact types whose source dir is
166
+ // missing or empty — typically because the surface was discovered via a
167
+ // manifest (plugin.json/agent.yaml) but never pulled by `source sync`.
168
+ // setup will silently no-op those types; surface that here so the user
169
+ // can re-sync or narrow the artifacts list.
170
+ if (activation.installMode === 'auto' && activation.artifacts.length > 0) {
171
+ const unsynced = findUnsyncedArtifactTypes(sourceName, activation.artifacts, root);
172
+ if (unsynced.length > 0) {
173
+ console.warn('');
174
+ console.warn(` warn: ${unsynced.length} artifact type(s) declared but not synced: ${unsynced.join(', ')}`);
175
+ console.warn(` warn: run "omc-manage source sync ${sourceName}" or remove them from --artifacts`);
176
+ }
177
+ }
178
+
179
+ if (flags.dryRun) {
180
+ console.log('');
181
+ console.log('[dry-run] No source config updated.');
182
+ return;
183
+ }
184
+
185
+ const updatedSource = await updateSource(sourceName, (current) => ({
186
+ ...current,
187
+ installMode: activation.installMode,
188
+ role: activation.role || undefined,
189
+ artifacts: activation.artifacts,
190
+ allowlist: activation.allowlist,
191
+ appliedProfile: activation.appliedProfile,
192
+ appliedAt: new Date().toISOString(),
193
+ }));
194
+
195
+ await writePlanAudit(sourceName, root, planResult, {
196
+ installMode: updatedSource.installMode,
197
+ role: updatedSource.role || null,
198
+ artifacts: updatedSource.artifacts,
199
+ allowlist: updatedSource.allowlist,
200
+ appliedProfile: updatedSource.appliedProfile || profile,
201
+ });
202
+
203
+ console.log('');
204
+ console.log('Applied to source config.');
205
+ console.log(` installMode: ${updatedSource.installMode}`);
206
+ console.log(` role: ${updatedSource.role || 'installable'}`);
207
+ console.log(` artifacts: ${(updatedSource.artifacts || []).join(', ')}`);
208
+ if (updatedSource.allowlist) {
209
+ console.log(` allowlist: ${Object.entries(updatedSource.allowlist).map(([type, names]) => `${type}(${names.length})`).join(', ')}`);
210
+ }
211
+ console.log(` audit: ${path.join(getSourceMetadataDir(sourceName, root), 'last-plan-apply.json')}`);
212
+ return;
213
+ }
214
+
215
+ default:
216
+ throw new Error(`Unknown subcommand: ${cmd}. Use: install or apply`);
217
+ }
218
+ }
219
+
220
+ module.exports = { plan };
package/src/cli/setup.js CHANGED
@@ -4,7 +4,7 @@ const fsp = require('fs/promises');
4
4
  const path = require('path');
5
5
  const os = require('os');
6
6
  const { getProjectRoot, getSourceArtifactDir, getInstallTarget, getMergeConfigPath, getReportDir } = require('../config/paths');
7
- const { readConfig } = require('../config/sources');
7
+ const { readConfig, filterItemsByAllowlist } = require('../config/sources');
8
8
  const { getArtifactTypeNames, ARTIFACT_TYPES } = require('../config/artifact-types');
9
9
  const { detectConflicts, resolveConflicts, applyResolutions, generateReport } = require('../merge/base-merger');
10
10
  const { loadSkillsFromSource } = require('../merge/skill-merger');
@@ -18,6 +18,22 @@ const { evaluateSkillQuality } = require('../utils/quality');
18
18
  const { copyDirRecursive } = require('./source');
19
19
 
20
20
  const OMC_VERSION_PATH = path.join(os.homedir(), '.claude', '.omc-version.json');
21
+ const OMC_CONFIG_PATH = path.join(os.homedir(), '.claude', '.omc-config.json');
22
+ const OMC_INSTALL_MANIFEST_PATH = path.join(os.homedir(), '.claude', '.omc-install-manifest.json');
23
+ const LEGACY_HOOK_PATHS = [
24
+ 'hooks.json',
25
+ 'hooks-cursor.json',
26
+ 'run-hook.cmd',
27
+ 'session-start',
28
+ 'session-start.mjs',
29
+ 'keyword-detector.mjs',
30
+ 'persistent-mode.mjs',
31
+ 'post-tool-use-failure.mjs',
32
+ 'post-tool-use.mjs',
33
+ 'pre-tool-use.mjs',
34
+ 'stop-continuation.mjs',
35
+ 'lib',
36
+ ];
21
37
 
22
38
  function getPackageVersion(root) {
23
39
  try {
@@ -41,6 +57,119 @@ async function writeInstallMetadata(root) {
41
57
  await fsp.writeFile(OMC_VERSION_PATH, JSON.stringify(metadata, null, 2) + '\n', 'utf8');
42
58
  }
43
59
 
60
+ async function readJsonFile(filePath, fallback) {
61
+ try {
62
+ return JSON.parse(await fsp.readFile(filePath, 'utf8'));
63
+ } catch {
64
+ return fallback;
65
+ }
66
+ }
67
+
68
+ function uniq(values) {
69
+ return [...new Set(values)];
70
+ }
71
+
72
+ function getManagedMetadataPaths(scope) {
73
+ const baseDir = scope === 'project'
74
+ ? path.join(process.cwd(), '.claude')
75
+ : path.join(os.homedir(), '.claude');
76
+
77
+ return {
78
+ configPath: path.join(baseDir, '.omc-config.json'),
79
+ manifestPath: path.join(baseDir, '.omc-install-manifest.json'),
80
+ };
81
+ }
82
+
83
+ function existingRelativePaths(installTarget, candidates) {
84
+ return uniq(candidates).filter(relativePath => fs.existsSync(path.join(installTarget, relativePath)));
85
+ }
86
+
87
+ function inferLegacyManagedPaths(artifactType, installTarget, desiredPaths, extra = {}) {
88
+ if (!fs.existsSync(installTarget) || !fs.statSync(installTarget).isDirectory()) {
89
+ return [];
90
+ }
91
+
92
+ switch (artifactType) {
93
+ case 'skills': {
94
+ const candidates = [...desiredPaths, ...(extra.excludedNames || [])];
95
+ return existingRelativePaths(installTarget, candidates);
96
+ }
97
+ case 'agents': {
98
+ const candidates = [];
99
+ for (const relativePath of desiredPaths) {
100
+ candidates.push(relativePath);
101
+ candidates.push(`${relativePath}.md`);
102
+ if (relativePath.endsWith('.md')) {
103
+ candidates.push(relativePath.slice(0, -3));
104
+ }
105
+ }
106
+ return existingRelativePaths(installTarget, candidates);
107
+ }
108
+ case 'commands': {
109
+ const candidates = [...desiredPaths];
110
+ const entries = fs.readdirSync(installTarget);
111
+ for (const entry of entries) {
112
+ if (entry.startsWith('oh-my-claudecode:') && entry.endsWith('.md')) {
113
+ candidates.push(entry);
114
+ }
115
+ }
116
+ return existingRelativePaths(installTarget, candidates);
117
+ }
118
+ case 'hooks': {
119
+ return existingRelativePaths(installTarget, [...desiredPaths, ...LEGACY_HOOK_PATHS]);
120
+ }
121
+ case 'hud':
122
+ return existingRelativePaths(installTarget, desiredPaths);
123
+ default:
124
+ return [];
125
+ }
126
+ }
127
+
128
+ async function pruneManagedPaths(installTarget, previousPaths, desiredPaths, flags) {
129
+ if (!fs.existsSync(installTarget) || !fs.statSync(installTarget).isDirectory()) {
130
+ return 0;
131
+ }
132
+
133
+ const desiredSet = new Set(desiredPaths);
134
+ const toRemove = uniq(previousPaths)
135
+ .filter(relativePath => !desiredSet.has(relativePath))
136
+ .sort((a, b) => b.split(path.sep).length - a.split(path.sep).length);
137
+
138
+ if (toRemove.length === 0) return 0;
139
+
140
+ if (flags.dryRun) {
141
+ for (const relativePath of toRemove) {
142
+ console.log(` would prune ${relativePath}`);
143
+ }
144
+ return toRemove.length;
145
+ }
146
+
147
+ for (const relativePath of toRemove) {
148
+ await fsp.rm(path.join(installTarget, relativePath), { recursive: true, force: true });
149
+ }
150
+
151
+ return toRemove.length;
152
+ }
153
+
154
+ async function writeOmcConfig(root, scope) {
155
+ if (scope !== 'user') return;
156
+
157
+ const now = new Date().toISOString();
158
+ const version = getPackageVersion(root);
159
+ const existing = await readJsonFile(OMC_CONFIG_PATH, {});
160
+ const next = {
161
+ ...existing,
162
+ configuredAt: existing.configuredAt || now,
163
+ updateRepository: 'materialofair/claudecode-omc',
164
+ updateBranch: 'main',
165
+ setupCompleted: now,
166
+ setupVersion: version,
167
+ };
168
+
169
+ await fsp.mkdir(path.dirname(OMC_CONFIG_PATH), { recursive: true });
170
+ await fsp.writeFile(OMC_CONFIG_PATH, JSON.stringify(next, null, 2) + '\n', 'utf8');
171
+ }
172
+
44
173
  async function copyDirectory(src, dest, options = {}) {
45
174
  if (!fs.existsSync(src)) return 0;
46
175
  if (!options.dryRun) await fsp.mkdir(dest, { recursive: true });
@@ -81,12 +210,13 @@ function collectSourcesForType(artifactType, orderedSources, root) {
81
210
  // Skip reference-only sources (e.g. anthropic-skills) — they provide
82
211
  // evaluation standards, not installable artifacts.
83
212
  if (src.role === 'reference') continue;
213
+ if (src.installMode && src.installMode !== 'auto') continue;
84
214
  const declaredArtifacts = src.artifacts || [];
85
215
  if (!declaredArtifacts.includes(artifactType)) continue;
86
216
 
87
217
  const dir = getSourceArtifactDir(name, artifactType, root);
88
218
  if (fs.existsSync(dir)) {
89
- sourcesForType.push({ name, dir, priority: src.priority });
219
+ sourcesForType.push({ name, dir, priority: src.priority, config: src });
90
220
  }
91
221
  }
92
222
 
@@ -102,8 +232,8 @@ async function installNameBasedArtifacts(artifactType, sources, mergeConfig, ins
102
232
  if (!loader) return { count: 0, total: 0 };
103
233
 
104
234
  const loaded = [];
105
- for (const { name, dir } of sources) {
106
- const items = loader(dir, name);
235
+ for (const { name, dir, config } of sources) {
236
+ const items = filterItemsByAllowlist(config, artifactType, loader(dir, name));
107
237
  if (items.length > 0) {
108
238
  loaded.push({ name, items });
109
239
  }
@@ -131,7 +261,13 @@ async function installNameBasedArtifacts(artifactType, sources, mergeConfig, ins
131
261
  for (const item of merged.sort((a, b) => a.name.localeCompare(b.name))) {
132
262
  console.log(` ${item.name} (${item.sourceName})`);
133
263
  }
134
- return { count: 0, total: merged.length, conflicts: conflicts.length };
264
+ return {
265
+ count: 0,
266
+ total: merged.length,
267
+ conflicts: conflicts.length,
268
+ managedPaths: merged.map(item => item.name),
269
+ excludedNames: excludeList,
270
+ };
135
271
  }
136
272
 
137
273
  await fsp.mkdir(installTarget, { recursive: true });
@@ -142,15 +278,24 @@ async function installNameBasedArtifacts(artifactType, sources, mergeConfig, ins
142
278
  const dest = path.join(installTarget, item.name);
143
279
  fileCount += await copyDirectory(item.path, dest, flags);
144
280
  } else {
145
- // Single file copy
146
- const dest = path.join(installTarget, item.name.includes('/') ? item.name : item.name);
281
+ // Single file copy. Loaders strip `.md` from item.name for matching/allowlist purposes;
282
+ // re-attach the source extension on disk so Claude Code's `*.md` loader picks them up.
283
+ const sourceExt = path.extname(item.path);
284
+ const destName = sourceExt && !item.name.endsWith(sourceExt) ? `${item.name}${sourceExt}` : item.name;
285
+ const dest = path.join(installTarget, destName);
147
286
  await fsp.mkdir(path.dirname(dest), { recursive: true });
148
287
  await fsp.copyFile(item.path, dest);
149
288
  fileCount += 1;
150
289
  }
151
290
  }
152
291
 
153
- return { count: fileCount, total: merged.length, conflicts: conflicts.length };
292
+ return {
293
+ count: fileCount,
294
+ total: merged.length,
295
+ conflicts: conflicts.length,
296
+ managedPaths: merged.map(item => item.name),
297
+ excludedNames: excludeList,
298
+ };
154
299
  }
155
300
 
156
301
  async function installHooks(sources, installTarget, flags) {
@@ -182,6 +327,21 @@ async function installHooks(sources, installTarget, flags) {
182
327
  }
183
328
  }
184
329
 
330
+ const managedPaths = [...(result.managedPaths || []), 'hooks.json'];
331
+ if (sources.some(({ dir }) => hasHookLib(dir))) {
332
+ managedPaths.push('lib');
333
+ }
334
+ if (sources.some(({ dir }) => fs.existsSync(path.join(dir, 'hooks-cursor.json')))) {
335
+ managedPaths.push('hooks-cursor.json');
336
+ }
337
+ if (sources.some(({ dir }) => fs.existsSync(path.join(dir, 'run-hook.cmd')))) {
338
+ managedPaths.push('run-hook.cmd');
339
+ }
340
+ if (sources.some(({ dir }) => fs.existsSync(path.join(dir, 'session-start')))) {
341
+ managedPaths.push('session-start');
342
+ }
343
+
344
+ result.managedPaths = uniq(managedPaths);
185
345
  return result;
186
346
  }
187
347
 
@@ -201,7 +361,7 @@ async function installSectionDocument(artifactType, sources, installTarget, flag
201
361
  for (const s of sections) {
202
362
  console.log(` section from: ${s.sourceName} (${s.content.length} chars)`);
203
363
  }
204
- return { count: 0, total: sections.length };
364
+ return { count: 0, total: sections.length, managedPaths: [path.basename(installTarget)] };
205
365
  }
206
366
 
207
367
  let finalContent;
@@ -223,7 +383,7 @@ async function installSectionDocument(artifactType, sources, installTarget, flag
223
383
  await fsp.mkdir(path.dirname(installTarget), { recursive: true });
224
384
  await fsp.writeFile(installTarget, finalContent, 'utf8');
225
385
 
226
- return { count: 1, total: sections.length };
386
+ return { count: 1, total: sections.length, managedPaths: [path.basename(installTarget)] };
227
387
  }
228
388
 
229
389
  async function installSettings(sources, installTarget, flags) {
@@ -241,7 +401,7 @@ async function installSettings(sources, installTarget, flags) {
241
401
  for (const f of fragments) {
242
402
  console.log(` fragment from: ${f.sourceName} (${Object.keys(f.fragment).join(', ')})`);
243
403
  }
244
- return { count: 0, total: fragments.length };
404
+ return { count: 0, total: fragments.length, managedPaths: [path.basename(installTarget)] };
245
405
  }
246
406
 
247
407
  let existing = {};
@@ -255,13 +415,14 @@ async function installSettings(sources, installTarget, flags) {
255
415
  await fsp.mkdir(path.dirname(installTarget), { recursive: true });
256
416
  await fsp.writeFile(installTarget, JSON.stringify(merged, null, 2) + '\n', 'utf8');
257
417
 
258
- return { count: 1, total: fragments.length };
418
+ return { count: 1, total: fragments.length, managedPaths: [path.basename(installTarget)] };
259
419
  }
260
420
 
261
421
  async function setup(args, flags = {}) {
262
422
  const root = getProjectRoot();
263
423
  const config = readConfig();
264
424
  const scope = flags.scope || 'user';
425
+ const { manifestPath } = getManagedMetadataPaths(scope);
265
426
  const typeFilter = flags.type
266
427
  ? [...new Set(flags.type.split(',').map(type => (type === 'claude-md' ? 'guidelines' : type)))]
267
428
  : null;
@@ -285,6 +446,12 @@ async function setup(args, flags = {}) {
285
446
 
286
447
  const allTypes = getArtifactTypeNames().filter(type => type !== 'claude-md');
287
448
  const typesToInstall = typeFilter || allTypes;
449
+ const previousManifest = await readJsonFile(manifestPath, { artifacts: {} });
450
+ const nextManifest = {
451
+ updatedAt: new Date().toISOString(),
452
+ scope,
453
+ artifacts: {},
454
+ };
288
455
  let step = 0;
289
456
  const totalSteps = typesToInstall.length;
290
457
 
@@ -333,6 +500,31 @@ async function setup(args, flags = {}) {
333
500
  console.log(` installed ${result.count} files (${result.total} items)`);
334
501
  }
335
502
 
503
+ if (typeConfig.format !== 'single-file' && typeConfig.format !== 'json') {
504
+ const previousPaths = previousManifest.artifacts?.[artifactType]?.paths;
505
+ const managedPaths = uniq(result.managedPaths || []);
506
+ const bootstrapPaths = previousPaths || inferLegacyManagedPaths(
507
+ artifactType,
508
+ installTarget,
509
+ managedPaths,
510
+ result,
511
+ );
512
+ const pruned = await pruneManagedPaths(installTarget, bootstrapPaths, managedPaths, flags);
513
+ if (pruned > 0) {
514
+ console.log(flags.dryRun ? ` would prune ${pruned} stale entries` : ` pruned ${pruned} stale entries`);
515
+ }
516
+
517
+ nextManifest.artifacts[artifactType] = {
518
+ target: installTarget,
519
+ paths: managedPaths,
520
+ };
521
+ } else {
522
+ nextManifest.artifacts[artifactType] = {
523
+ target: installTarget,
524
+ paths: result.managedPaths || [path.basename(installTarget)],
525
+ };
526
+ }
527
+
336
528
  if (result.conflicts > 0) {
337
529
  console.log(` resolved ${result.conflicts} conflicts`);
338
530
  }
@@ -340,6 +532,11 @@ async function setup(args, flags = {}) {
340
532
 
341
533
  if (!flags.dryRun && scope === 'user') {
342
534
  await writeInstallMetadata(root);
535
+ await writeOmcConfig(root, scope);
536
+ await fsp.writeFile(manifestPath, JSON.stringify(nextManifest, null, 2) + '\n', 'utf8');
537
+ } else if (!flags.dryRun && scope === 'project') {
538
+ await fsp.mkdir(path.dirname(manifestPath), { recursive: true });
539
+ await fsp.writeFile(manifestPath, JSON.stringify(nextManifest, null, 2) + '\n', 'utf8');
343
540
  }
344
541
 
345
542
  console.log('\nDone.');