@macpaw/cctk 1.0.0-beta.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 (415) hide show
  1. package/License +21 -0
  2. package/README.md +142 -0
  3. package/bin/index.js +5 -0
  4. package/dist/index.js +1 -0
  5. package/package.json +65 -0
  6. package/templates/claude/agents/brainstormer.md +113 -0
  7. package/templates/claude/agents/code-reviewer.md +157 -0
  8. package/templates/claude/agents/copywriter.md +110 -0
  9. package/templates/claude/agents/database-admin.md +92 -0
  10. package/templates/claude/agents/debugger.md +137 -0
  11. package/templates/claude/agents/docs-manager.md +208 -0
  12. package/templates/claude/agents/fullstack-developer.md +95 -0
  13. package/templates/claude/agents/git-manager.md +394 -0
  14. package/templates/claude/agents/journal-writer.md +113 -0
  15. package/templates/claude/agents/mcp-manager.md +89 -0
  16. package/templates/claude/agents/planner.md +108 -0
  17. package/templates/claude/agents/project-manager.md +125 -0
  18. package/templates/claude/agents/registry.json +304 -0
  19. package/templates/claude/agents/researcher.md +37 -0
  20. package/templates/claude/agents/scout-external.md +140 -0
  21. package/templates/claude/agents/scout.md +106 -0
  22. package/templates/claude/agents/tester.md +105 -0
  23. package/templates/claude/agents/ui-ux-designer.md +208 -0
  24. package/templates/claude/commands/ask.md +56 -0
  25. package/templates/claude/commands/bootstrap/auto/fast.md +106 -0
  26. package/templates/claude/commands/bootstrap/auto/parallel.md +64 -0
  27. package/templates/claude/commands/bootstrap/auto.md +110 -0
  28. package/templates/claude/commands/bootstrap.md +130 -0
  29. package/templates/claude/commands/brainstorm.md +75 -0
  30. package/templates/claude/commands/code/auto.md +198 -0
  31. package/templates/claude/commands/code/no-test.md +172 -0
  32. package/templates/claude/commands/code/parallel.md +100 -0
  33. package/templates/claude/commands/code.md +197 -0
  34. package/templates/claude/commands/coding-level.md +37 -0
  35. package/templates/claude/commands/content/cro.md +41 -0
  36. package/templates/claude/commands/content/enhance.md +12 -0
  37. package/templates/claude/commands/content/fast.md +11 -0
  38. package/templates/claude/commands/content/good.md +14 -0
  39. package/templates/claude/commands/cook/auto/fast.md +26 -0
  40. package/templates/claude/commands/cook/auto/parallel.md +49 -0
  41. package/templates/claude/commands/cook/auto.md +15 -0
  42. package/templates/claude/commands/cook.md +101 -0
  43. package/templates/claude/commands/debug.md +13 -0
  44. package/templates/claude/commands/docs/init.md +37 -0
  45. package/templates/claude/commands/docs/summarize.md +22 -0
  46. package/templates/claude/commands/docs/update.md +78 -0
  47. package/templates/claude/commands/fix/ci.md +17 -0
  48. package/templates/claude/commands/fix/fast.md +18 -0
  49. package/templates/claude/commands/fix/hard.md +35 -0
  50. package/templates/claude/commands/fix/logs.md +26 -0
  51. package/templates/claude/commands/fix/parallel.md +54 -0
  52. package/templates/claude/commands/fix/test.md +20 -0
  53. package/templates/claude/commands/fix/types.md +9 -0
  54. package/templates/claude/commands/fix/ui.md +33 -0
  55. package/templates/claude/commands/fix.md +43 -0
  56. package/templates/claude/commands/git/cm.md +5 -0
  57. package/templates/claude/commands/git/cp.md +4 -0
  58. package/templates/claude/commands/git/merge.md +40 -0
  59. package/templates/claude/commands/git/pr.md +50 -0
  60. package/templates/claude/commands/journal.md +7 -0
  61. package/templates/claude/commands/kanban.md +99 -0
  62. package/templates/claude/commands/plan/archive.md +57 -0
  63. package/templates/claude/commands/plan/ci.md +33 -0
  64. package/templates/claude/commands/plan/cro.md +67 -0
  65. package/templates/claude/commands/plan/fast.md +66 -0
  66. package/templates/claude/commands/plan/hard.md +92 -0
  67. package/templates/claude/commands/plan/parallel.md +129 -0
  68. package/templates/claude/commands/plan/two.md +45 -0
  69. package/templates/claude/commands/plan/validate.md +117 -0
  70. package/templates/claude/commands/plan.md +30 -0
  71. package/templates/claude/commands/preview.md +87 -0
  72. package/templates/claude/commands/registry.json +313 -0
  73. package/templates/claude/commands/review/codebase/parallel.md +122 -0
  74. package/templates/claude/commands/review/codebase.md +47 -0
  75. package/templates/claude/commands/scout/ext.md +35 -0
  76. package/templates/claude/commands/scout.md +28 -0
  77. package/templates/claude/commands/skill/add.md +36 -0
  78. package/templates/claude/commands/skill/create.md +29 -0
  79. package/templates/claude/commands/skill/fix-logs.md +22 -0
  80. package/templates/claude/commands/skill/optimize/auto.md +25 -0
  81. package/templates/claude/commands/skill/optimize.md +34 -0
  82. package/templates/claude/commands/skill/plan.md +45 -0
  83. package/templates/claude/commands/test/ui.md +91 -0
  84. package/templates/claude/commands/test.md +8 -0
  85. package/templates/claude/commands/use-mcp.md +34 -0
  86. package/templates/claude/commands/watzup.md +8 -0
  87. package/templates/claude/commands/worktree.md +126 -0
  88. package/templates/claude/hooks/dev-rules-reminder.cjs +258 -0
  89. package/templates/claude/hooks/docs/README.md +42 -0
  90. package/templates/claude/hooks/lib/cctk-config-utils.cjs +751 -0
  91. package/templates/claude/hooks/lib/cctk-paths.cjs +106 -0
  92. package/templates/claude/hooks/lib/context-tracker.cjs +346 -0
  93. package/templates/claude/hooks/privacy-block.cjs +289 -0
  94. package/templates/claude/hooks/registry.json +77 -0
  95. package/templates/claude/hooks/scout-block/broad-pattern-detector.cjs +293 -0
  96. package/templates/claude/hooks/scout-block/error-formatter.cjs +156 -0
  97. package/templates/claude/hooks/scout-block/path-extractor.cjs +359 -0
  98. package/templates/claude/hooks/scout-block/pattern-matcher.cjs +184 -0
  99. package/templates/claude/hooks/scout-block/vendor/ignore.js +626 -0
  100. package/templates/claude/hooks/scout-block.cjs +167 -0
  101. package/templates/claude/hooks/session-end.cjs +35 -0
  102. package/templates/claude/hooks/session-init.cjs +214 -0
  103. package/templates/claude/hooks/subagent-init.cjs +161 -0
  104. package/templates/claude/hooks/write-compact-marker.cjs +153 -0
  105. package/templates/claude/output-styles/coding-level-1.md +148 -0
  106. package/templates/claude/output-styles/coding-level-2.md +159 -0
  107. package/templates/claude/output-styles/coding-level-3.md +91 -0
  108. package/templates/claude/scripts/README.md +33 -0
  109. package/templates/claude/scripts/generate-catalogs.cjs +318 -0
  110. package/templates/claude/scripts/registry.json +48 -0
  111. package/templates/claude/scripts/set-active-plan.cjs +45 -0
  112. package/templates/claude/scripts/validate-docs.cjs +447 -0
  113. package/templates/claude/scripts/worktree.cjs +658 -0
  114. package/templates/claude/skills/README.md +112 -0
  115. package/templates/claude/skills/ai-artist/SKILL.md +75 -0
  116. package/templates/claude/skills/ai-artist/references/advanced-techniques.md +184 -0
  117. package/templates/claude/skills/ai-artist/references/domain-code.md +66 -0
  118. package/templates/claude/skills/ai-artist/references/domain-data.md +72 -0
  119. package/templates/claude/skills/ai-artist/references/domain-marketing.md +66 -0
  120. package/templates/claude/skills/ai-artist/references/domain-patterns.md +33 -0
  121. package/templates/claude/skills/ai-artist/references/domain-writing.md +68 -0
  122. package/templates/claude/skills/ai-artist/references/image-prompting.md +141 -0
  123. package/templates/claude/skills/ai-artist/references/llm-prompting.md +165 -0
  124. package/templates/claude/skills/ai-artist/references/nano-banana.md +59 -0
  125. package/templates/claude/skills/ai-artist/references/reasoning-techniques.md +201 -0
  126. package/templates/claude/skills/backend-development/SKILL.md +95 -0
  127. package/templates/claude/skills/backend-development/references/backend-api-design.md +495 -0
  128. package/templates/claude/skills/backend-development/references/backend-architecture.md +454 -0
  129. package/templates/claude/skills/backend-development/references/backend-authentication.md +338 -0
  130. package/templates/claude/skills/backend-development/references/backend-code-quality.md +659 -0
  131. package/templates/claude/skills/backend-development/references/backend-debugging.md +904 -0
  132. package/templates/claude/skills/backend-development/references/backend-devops.md +494 -0
  133. package/templates/claude/skills/backend-development/references/backend-mindset.md +387 -0
  134. package/templates/claude/skills/backend-development/references/backend-performance.md +397 -0
  135. package/templates/claude/skills/backend-development/references/backend-security.md +290 -0
  136. package/templates/claude/skills/backend-development/references/backend-technologies.md +256 -0
  137. package/templates/claude/skills/backend-development/references/backend-testing.md +429 -0
  138. package/templates/claude/skills/better-auth/SKILL.md +204 -0
  139. package/templates/claude/skills/better-auth/references/advanced-features.md +553 -0
  140. package/templates/claude/skills/better-auth/references/database-integration.md +577 -0
  141. package/templates/claude/skills/better-auth/references/email-password-auth.md +416 -0
  142. package/templates/claude/skills/better-auth/references/oauth-providers.md +430 -0
  143. package/templates/claude/skills/better-auth/scripts/better_auth_init.py +521 -0
  144. package/templates/claude/skills/chrome-devtools/SKILL.md +473 -0
  145. package/templates/claude/skills/chrome-devtools/references/cdp-domains.md +694 -0
  146. package/templates/claude/skills/chrome-devtools/references/performance-guide.md +940 -0
  147. package/templates/claude/skills/chrome-devtools/references/puppeteer-reference.md +953 -0
  148. package/templates/claude/skills/chrome-devtools/scripts/README.md +288 -0
  149. package/templates/claude/skills/chrome-devtools/scripts/aria-snapshot.js +368 -0
  150. package/templates/claude/skills/chrome-devtools/scripts/click.js +92 -0
  151. package/templates/claude/skills/chrome-devtools/scripts/console.js +85 -0
  152. package/templates/claude/skills/chrome-devtools/scripts/evaluate.js +59 -0
  153. package/templates/claude/skills/chrome-devtools/scripts/fill.js +84 -0
  154. package/templates/claude/skills/chrome-devtools/scripts/inject-auth.js +247 -0
  155. package/templates/claude/skills/chrome-devtools/scripts/install-deps.sh +11 -0
  156. package/templates/claude/skills/chrome-devtools/scripts/install.sh +36 -0
  157. package/templates/claude/skills/chrome-devtools/scripts/lib/browser.js +335 -0
  158. package/templates/claude/skills/chrome-devtools/scripts/lib/selector.js +183 -0
  159. package/templates/claude/skills/chrome-devtools/scripts/navigate.js +60 -0
  160. package/templates/claude/skills/chrome-devtools/scripts/network.js +113 -0
  161. package/templates/claude/skills/chrome-devtools/scripts/package.json +16 -0
  162. package/templates/claude/skills/chrome-devtools/scripts/performance.js +159 -0
  163. package/templates/claude/skills/chrome-devtools/scripts/screenshot.js +212 -0
  164. package/templates/claude/skills/chrome-devtools/scripts/select-ref.js +151 -0
  165. package/templates/claude/skills/chrome-devtools/scripts/snapshot.js +143 -0
  166. package/templates/claude/skills/chrome-devtools/scripts/ws-debug.js +47 -0
  167. package/templates/claude/skills/chrome-devtools/scripts/ws-full-debug.js +115 -0
  168. package/templates/claude/skills/claude-code/references/advanced-features.md +399 -0
  169. package/templates/claude/skills/claude-code/references/agent-skills.md +399 -0
  170. package/templates/claude/skills/claude-code/references/api-reference.md +498 -0
  171. package/templates/claude/skills/claude-code/references/best-practices.md +447 -0
  172. package/templates/claude/skills/claude-code/references/cicd-integration.md +428 -0
  173. package/templates/claude/skills/claude-code/references/common-workflows.md +107 -0
  174. package/templates/claude/skills/claude-code/references/configuration.md +480 -0
  175. package/templates/claude/skills/claude-code/references/enterprise-features.md +472 -0
  176. package/templates/claude/skills/claude-code/references/getting-started.md +244 -0
  177. package/templates/claude/skills/claude-code/references/hooks-and-plugins.md +444 -0
  178. package/templates/claude/skills/claude-code/references/hooks-comprehensive.md +622 -0
  179. package/templates/claude/skills/claude-code/references/ide-integration.md +316 -0
  180. package/templates/claude/skills/claude-code/references/mcp-integration.md +386 -0
  181. package/templates/claude/skills/claude-code/references/slash-commands.md +460 -0
  182. package/templates/claude/skills/claude-code/references/troubleshooting.md +455 -0
  183. package/templates/claude/skills/claude-code/skill.md +60 -0
  184. package/templates/claude/skills/code-review/SKILL.md +143 -0
  185. package/templates/claude/skills/code-review/references/code-review-reception.md +209 -0
  186. package/templates/claude/skills/code-review/references/requesting-code-review.md +105 -0
  187. package/templates/claude/skills/code-review/references/verification-before-completion.md +139 -0
  188. package/templates/claude/skills/context-engineering/SKILL.md +86 -0
  189. package/templates/claude/skills/context-engineering/references/context-compression.md +84 -0
  190. package/templates/claude/skills/context-engineering/references/context-degradation.md +93 -0
  191. package/templates/claude/skills/context-engineering/references/context-fundamentals.md +75 -0
  192. package/templates/claude/skills/context-engineering/references/context-optimization.md +82 -0
  193. package/templates/claude/skills/context-engineering/references/evaluation.md +89 -0
  194. package/templates/claude/skills/context-engineering/references/memory-systems.md +88 -0
  195. package/templates/claude/skills/context-engineering/references/multi-agent-patterns.md +90 -0
  196. package/templates/claude/skills/context-engineering/references/project-development.md +97 -0
  197. package/templates/claude/skills/context-engineering/references/tool-design.md +86 -0
  198. package/templates/claude/skills/context-engineering/scripts/compression_evaluator.py +329 -0
  199. package/templates/claude/skills/context-engineering/scripts/context_analyzer.py +294 -0
  200. package/templates/claude/skills/databases/SKILL.md +232 -0
  201. package/templates/claude/skills/databases/references/mongodb-aggregation.md +447 -0
  202. package/templates/claude/skills/databases/references/mongodb-atlas.md +465 -0
  203. package/templates/claude/skills/databases/references/mongodb-crud.md +408 -0
  204. package/templates/claude/skills/databases/references/mongodb-indexing.md +442 -0
  205. package/templates/claude/skills/databases/references/postgresql-administration.md +594 -0
  206. package/templates/claude/skills/databases/references/postgresql-performance.md +527 -0
  207. package/templates/claude/skills/databases/references/postgresql-psql-cli.md +467 -0
  208. package/templates/claude/skills/databases/references/postgresql-queries.md +475 -0
  209. package/templates/claude/skills/databases/scripts/db_backup.py +502 -0
  210. package/templates/claude/skills/databases/scripts/db_migrate.py +414 -0
  211. package/templates/claude/skills/databases/scripts/db_performance_check.py +445 -0
  212. package/templates/claude/skills/debugging/SKILL.md +84 -0
  213. package/templates/claude/skills/debugging/references/defense-in-depth.md +124 -0
  214. package/templates/claude/skills/debugging/references/root-cause-tracing.md +122 -0
  215. package/templates/claude/skills/debugging/references/systematic-debugging.md +102 -0
  216. package/templates/claude/skills/debugging/references/verification.md +123 -0
  217. package/templates/claude/skills/debugging/scripts/find-polluter.sh +63 -0
  218. package/templates/claude/skills/debugging/scripts/find-polluter.test.md +102 -0
  219. package/templates/claude/skills/devops/SKILL.md +293 -0
  220. package/templates/claude/skills/devops/references/browser-rendering.md +305 -0
  221. package/templates/claude/skills/devops/references/cloudflare-d1-kv.md +123 -0
  222. package/templates/claude/skills/devops/references/cloudflare-platform.md +271 -0
  223. package/templates/claude/skills/devops/references/cloudflare-r2-storage.md +280 -0
  224. package/templates/claude/skills/devops/references/cloudflare-workers-advanced.md +312 -0
  225. package/templates/claude/skills/devops/references/cloudflare-workers-apis.md +309 -0
  226. package/templates/claude/skills/devops/references/cloudflare-workers-basics.md +418 -0
  227. package/templates/claude/skills/devops/references/docker-basics.md +297 -0
  228. package/templates/claude/skills/devops/references/docker-compose.md +292 -0
  229. package/templates/claude/skills/devops/references/gcloud-platform.md +307 -0
  230. package/templates/claude/skills/devops/references/gcloud-services.md +304 -0
  231. package/templates/claude/skills/devops/scripts/cloudflare_deploy.py +269 -0
  232. package/templates/claude/skills/devops/scripts/docker_optimize.py +320 -0
  233. package/templates/claude/skills/docs-seeker/SKILL.md +95 -0
  234. package/templates/claude/skills/docs-seeker/package.json +24 -0
  235. package/templates/claude/skills/docs-seeker/references/advanced.md +78 -0
  236. package/templates/claude/skills/docs-seeker/references/context7-patterns.md +68 -0
  237. package/templates/claude/skills/docs-seeker/references/errors.md +68 -0
  238. package/templates/claude/skills/docs-seeker/scripts/analyze-llms-txt.js +245 -0
  239. package/templates/claude/skills/docs-seeker/scripts/detect-topic.js +172 -0
  240. package/templates/claude/skills/docs-seeker/scripts/fetch-docs.js +212 -0
  241. package/templates/claude/skills/docs-seeker/workflows/library-search.md +87 -0
  242. package/templates/claude/skills/docs-seeker/workflows/repo-analysis.md +91 -0
  243. package/templates/claude/skills/docs-seeker/workflows/topic-search.md +77 -0
  244. package/templates/claude/skills/frontend-design/SKILL.md +85 -0
  245. package/templates/claude/skills/frontend-design/references/analysis-best-practices.md +80 -0
  246. package/templates/claude/skills/frontend-design/references/analysis-prompts.md +141 -0
  247. package/templates/claude/skills/frontend-design/references/analysis-techniques.md +118 -0
  248. package/templates/claude/skills/frontend-design/references/animejs.md +396 -0
  249. package/templates/claude/skills/frontend-design/references/design-extraction-overview.md +71 -0
  250. package/templates/claude/skills/frontend-design/references/extraction-best-practices.md +141 -0
  251. package/templates/claude/skills/frontend-design/references/extraction-output-templates.md +162 -0
  252. package/templates/claude/skills/frontend-design/references/extraction-prompts.md +127 -0
  253. package/templates/claude/skills/frontend-design/references/technical-accessibility.md +119 -0
  254. package/templates/claude/skills/frontend-design/references/technical-best-practices.md +97 -0
  255. package/templates/claude/skills/frontend-design/references/technical-optimization.md +44 -0
  256. package/templates/claude/skills/frontend-design/references/technical-overview.md +90 -0
  257. package/templates/claude/skills/frontend-design/references/technical-workflows.md +150 -0
  258. package/templates/claude/skills/frontend-design/references/visual-analysis-overview.md +95 -0
  259. package/templates/claude/skills/frontend-development/SKILL.md +399 -0
  260. package/templates/claude/skills/frontend-development/resources/common-patterns.md +331 -0
  261. package/templates/claude/skills/frontend-development/resources/complete-examples.md +872 -0
  262. package/templates/claude/skills/frontend-development/resources/component-patterns.md +502 -0
  263. package/templates/claude/skills/frontend-development/resources/data-fetching.md +767 -0
  264. package/templates/claude/skills/frontend-development/resources/file-organization.md +502 -0
  265. package/templates/claude/skills/frontend-development/resources/loading-and-error-states.md +501 -0
  266. package/templates/claude/skills/frontend-development/resources/performance.md +406 -0
  267. package/templates/claude/skills/frontend-development/resources/routing-guide.md +364 -0
  268. package/templates/claude/skills/frontend-development/resources/styling-guide.md +428 -0
  269. package/templates/claude/skills/frontend-development/resources/typescript-standards.md +418 -0
  270. package/templates/claude/skills/markdown-novel-viewer/SKILL.md +272 -0
  271. package/templates/claude/skills/markdown-novel-viewer/assets/directory-browser.css +215 -0
  272. package/templates/claude/skills/markdown-novel-viewer/assets/favicon.png +0 -0
  273. package/templates/claude/skills/markdown-novel-viewer/assets/novel-theme.css +872 -0
  274. package/templates/claude/skills/markdown-novel-viewer/assets/reader.js +378 -0
  275. package/templates/claude/skills/markdown-novel-viewer/assets/template.html +85 -0
  276. package/templates/claude/skills/markdown-novel-viewer/package.json +15 -0
  277. package/templates/claude/skills/markdown-novel-viewer/scripts/lib/http-server.cjs +434 -0
  278. package/templates/claude/skills/markdown-novel-viewer/scripts/lib/markdown-renderer.cjs +335 -0
  279. package/templates/claude/skills/markdown-novel-viewer/scripts/lib/plan-navigator.cjs +509 -0
  280. package/templates/claude/skills/markdown-novel-viewer/scripts/lib/port-finder.cjs +49 -0
  281. package/templates/claude/skills/markdown-novel-viewer/scripts/lib/process-mgr.cjs +150 -0
  282. package/templates/claude/skills/markdown-novel-viewer/scripts/server.cjs +398 -0
  283. package/templates/claude/skills/mcp-builder/SKILL.md +328 -0
  284. package/templates/claude/skills/mcp-builder/reference/evaluation.md +602 -0
  285. package/templates/claude/skills/mcp-builder/reference/mcp_best_practices.md +915 -0
  286. package/templates/claude/skills/mcp-builder/reference/node_mcp_server.md +916 -0
  287. package/templates/claude/skills/mcp-builder/reference/python_mcp_server.md +752 -0
  288. package/templates/claude/skills/mcp-builder/scripts/connections.py +151 -0
  289. package/templates/claude/skills/mcp-builder/scripts/evaluation.py +381 -0
  290. package/templates/claude/skills/mcp-builder/scripts/example_evaluation.xml +22 -0
  291. package/templates/claude/skills/mcp-builder/scripts/requirements.txt +2 -0
  292. package/templates/claude/skills/mcp-management/README.md +219 -0
  293. package/templates/claude/skills/mcp-management/SKILL.md +209 -0
  294. package/templates/claude/skills/mcp-management/assets/tools.json +3146 -0
  295. package/templates/claude/skills/mcp-management/references/configuration.md +114 -0
  296. package/templates/claude/skills/mcp-management/references/gemini-cli-integration.md +209 -0
  297. package/templates/claude/skills/mcp-management/references/mcp-protocol.md +116 -0
  298. package/templates/claude/skills/mcp-management/scripts/.env.example +10 -0
  299. package/templates/claude/skills/mcp-management/scripts/cli.ts +202 -0
  300. package/templates/claude/skills/mcp-management/scripts/mcp-client.ts +247 -0
  301. package/templates/claude/skills/mcp-management/scripts/package.json +20 -0
  302. package/templates/claude/skills/mcp-management/scripts/tsconfig.json +15 -0
  303. package/templates/claude/skills/media-processing/SKILL.md +91 -0
  304. package/templates/claude/skills/media-processing/references/common-workflows.md +132 -0
  305. package/templates/claude/skills/media-processing/references/ffmpeg-encoding.md +358 -0
  306. package/templates/claude/skills/media-processing/references/ffmpeg-filters.md +503 -0
  307. package/templates/claude/skills/media-processing/references/ffmpeg-streaming.md +395 -0
  308. package/templates/claude/skills/media-processing/references/format-compatibility.md +375 -0
  309. package/templates/claude/skills/media-processing/references/imagemagick-batch.md +612 -0
  310. package/templates/claude/skills/media-processing/references/imagemagick-editing.md +623 -0
  311. package/templates/claude/skills/media-processing/references/rmbg-background-removal.md +66 -0
  312. package/templates/claude/skills/media-processing/references/troubleshooting.md +109 -0
  313. package/templates/claude/skills/media-processing/scripts/README.md +102 -0
  314. package/templates/claude/skills/media-processing/scripts/batch-remove-background.sh +124 -0
  315. package/templates/claude/skills/media-processing/scripts/batch_resize.py +342 -0
  316. package/templates/claude/skills/media-processing/scripts/media_convert.py +311 -0
  317. package/templates/claude/skills/media-processing/scripts/remove-background.sh +96 -0
  318. package/templates/claude/skills/media-processing/scripts/remove-bg-node.js +181 -0
  319. package/templates/claude/skills/mermaidjs-v11/SKILL.md +115 -0
  320. package/templates/claude/skills/mermaidjs-v11/references/cli-usage.md +228 -0
  321. package/templates/claude/skills/mermaidjs-v11/references/configuration.md +232 -0
  322. package/templates/claude/skills/mermaidjs-v11/references/diagram-types.md +315 -0
  323. package/templates/claude/skills/mermaidjs-v11/references/examples.md +344 -0
  324. package/templates/claude/skills/mermaidjs-v11/references/integration.md +310 -0
  325. package/templates/claude/skills/planning/SKILL.md +115 -0
  326. package/templates/claude/skills/planning/references/codebase-understanding.md +62 -0
  327. package/templates/claude/skills/planning/references/output-standards.md +127 -0
  328. package/templates/claude/skills/planning/references/plan-organization.md +150 -0
  329. package/templates/claude/skills/planning/references/research-phase.md +49 -0
  330. package/templates/claude/skills/planning/references/solution-design.md +63 -0
  331. package/templates/claude/skills/plans-kanban/SKILL.md +157 -0
  332. package/templates/claude/skills/plans-kanban/assets/dashboard-template.html +119 -0
  333. package/templates/claude/skills/plans-kanban/assets/dashboard.css +1594 -0
  334. package/templates/claude/skills/plans-kanban/assets/dashboard.js +659 -0
  335. package/templates/claude/skills/plans-kanban/assets/favicon.png +0 -0
  336. package/templates/claude/skills/plans-kanban/package.json +13 -0
  337. package/templates/claude/skills/plans-kanban/scripts/lib/dashboard-renderer.cjs +941 -0
  338. package/templates/claude/skills/plans-kanban/scripts/lib/http-server.cjs +310 -0
  339. package/templates/claude/skills/plans-kanban/scripts/lib/plan-metadata-extractor.cjs +489 -0
  340. package/templates/claude/skills/plans-kanban/scripts/lib/plan-parser.cjs +194 -0
  341. package/templates/claude/skills/plans-kanban/scripts/lib/plan-scanner.cjs +277 -0
  342. package/templates/claude/skills/plans-kanban/scripts/lib/port-finder.cjs +49 -0
  343. package/templates/claude/skills/plans-kanban/scripts/lib/process-mgr.cjs +128 -0
  344. package/templates/claude/skills/plans-kanban/scripts/server.cjs +249 -0
  345. package/templates/claude/skills/problem-solving/SKILL.md +96 -0
  346. package/templates/claude/skills/problem-solving/references/attribution.md +69 -0
  347. package/templates/claude/skills/problem-solving/references/collision-zone-thinking.md +79 -0
  348. package/templates/claude/skills/problem-solving/references/inversion-exercise.md +91 -0
  349. package/templates/claude/skills/problem-solving/references/meta-pattern-recognition.md +87 -0
  350. package/templates/claude/skills/problem-solving/references/scale-game.md +95 -0
  351. package/templates/claude/skills/problem-solving/references/simplification-cascades.md +80 -0
  352. package/templates/claude/skills/problem-solving/references/when-stuck.md +72 -0
  353. package/templates/claude/skills/registry.json +258 -0
  354. package/templates/claude/skills/repomix/SKILL.md +247 -0
  355. package/templates/claude/skills/repomix/references/configuration.md +211 -0
  356. package/templates/claude/skills/repomix/references/usage-patterns.md +232 -0
  357. package/templates/claude/skills/repomix/scripts/README.md +179 -0
  358. package/templates/claude/skills/repomix/scripts/repomix_batch.py +455 -0
  359. package/templates/claude/skills/repomix/scripts/repos.example.json +15 -0
  360. package/templates/claude/skills/research/SKILL.md +168 -0
  361. package/templates/claude/skills/sequential-thinking/.env.example +8 -0
  362. package/templates/claude/skills/sequential-thinking/README.md +183 -0
  363. package/templates/claude/skills/sequential-thinking/SKILL.md +94 -0
  364. package/templates/claude/skills/sequential-thinking/package.json +31 -0
  365. package/templates/claude/skills/sequential-thinking/references/advanced-strategies.md +79 -0
  366. package/templates/claude/skills/sequential-thinking/references/advanced-techniques.md +76 -0
  367. package/templates/claude/skills/sequential-thinking/references/core-patterns.md +95 -0
  368. package/templates/claude/skills/sequential-thinking/references/examples-api.md +88 -0
  369. package/templates/claude/skills/sequential-thinking/references/examples-architecture.md +94 -0
  370. package/templates/claude/skills/sequential-thinking/references/examples-debug.md +90 -0
  371. package/templates/claude/skills/sequential-thinking/scripts/format-thought.js +182 -0
  372. package/templates/claude/skills/sequential-thinking/scripts/process-thought.js +252 -0
  373. package/templates/claude/skills/skill-creator/LICENSE.txt +202 -0
  374. package/templates/claude/skills/skill-creator/SKILL.md +266 -0
  375. package/templates/claude/skills/skill-creator/references/agent-skills-spec.md +51 -0
  376. package/templates/claude/skills/skill-creator/scripts/encoding_utils.py +21 -0
  377. package/templates/claude/skills/skill-creator/scripts/init_skill.py +304 -0
  378. package/templates/claude/skills/skill-creator/scripts/package_skill.py +110 -0
  379. package/templates/claude/skills/skill-creator/scripts/quick_validate.py +66 -0
  380. package/templates/claude/skills/template-skill/SKILL.md +6 -0
  381. package/templates/claude/skills/vitest/SKILL.md +595 -0
  382. package/templates/claude/skills/vitest/references/async-patterns.md +82 -0
  383. package/templates/claude/skills/vitest/references/mock-patterns.md +78 -0
  384. package/templates/claude/skills/vitest/references/monorepo-setup.md +185 -0
  385. package/templates/claude/skills/vitest/references/turborepo-setup.md +332 -0
  386. package/templates/claude/skills/web-frameworks/SKILL.md +324 -0
  387. package/templates/claude/skills/web-frameworks/references/nextjs-app-router.md +465 -0
  388. package/templates/claude/skills/web-frameworks/references/nextjs-data-fetching.md +459 -0
  389. package/templates/claude/skills/web-frameworks/references/nextjs-optimization.md +511 -0
  390. package/templates/claude/skills/web-frameworks/references/nextjs-server-components.md +495 -0
  391. package/templates/claude/skills/web-frameworks/references/remix-icon-integration.md +603 -0
  392. package/templates/claude/skills/web-frameworks/references/turborepo-caching.md +551 -0
  393. package/templates/claude/skills/web-frameworks/references/turborepo-pipelines.md +517 -0
  394. package/templates/claude/skills/web-frameworks/references/turborepo-setup.md +542 -0
  395. package/templates/claude/skills/web-frameworks/scripts/nextjs_init.py +547 -0
  396. package/templates/claude/skills/web-frameworks/scripts/turborepo_migrate.py +394 -0
  397. package/templates/claude/workflows/development-rules.md +40 -0
  398. package/templates/claude/workflows/documentation-management.md +121 -0
  399. package/templates/claude/workflows/orchestration-protocol.md +16 -0
  400. package/templates/claude/workflows/primary-workflow.md +45 -0
  401. package/templates/claude/workflows/registry.json +37 -0
  402. package/templates/common/.cct.json +41 -0
  403. package/templates/common/.cctkignore +22 -0
  404. package/templates/common/.env.example +39 -0
  405. package/templates/common/.mcp.json.example +16 -0
  406. package/templates/common/metadata.json +15 -0
  407. package/templates/common/settings.json +79 -0
  408. package/templates/common/statusline.cjs +271 -0
  409. package/templates/config/.repomixignore +22 -0
  410. package/templates/config/AGENTS.md +55 -0
  411. package/templates/config/CLAUDE.md +87 -0
  412. package/templates/plans/bug-fix-template.md +69 -0
  413. package/templates/plans/feature-implementation-template.md +84 -0
  414. package/templates/plans/refactor-template.md +82 -0
  415. package/templates/plans/template-usage-guide.md +58 -0
@@ -0,0 +1,502 @@
1
+ #!/usr/bin/env python3
2
+ """
3
+ Database backup and restore tool for MongoDB and PostgreSQL.
4
+ Supports compression, scheduling, and verification.
5
+ """
6
+
7
+ import argparse
8
+ import gzip
9
+ import json
10
+ import os
11
+ import shutil
12
+ import subprocess
13
+ import sys
14
+ from dataclasses import dataclass
15
+ from datetime import datetime
16
+ from pathlib import Path
17
+ from typing import Dict, List, Optional
18
+
19
+
20
+ @dataclass
21
+ class BackupInfo:
22
+ """Backup metadata."""
23
+
24
+ filename: str
25
+ database_type: str
26
+ database_name: str
27
+ timestamp: datetime
28
+ size_bytes: int
29
+ compressed: bool
30
+ verified: bool = False
31
+
32
+
33
+ class BackupManager:
34
+ """Manages database backups for MongoDB and PostgreSQL."""
35
+
36
+ def __init__(self, db_type: str, backup_dir: str = "./backups"):
37
+ """
38
+ Initialize backup manager.
39
+
40
+ Args:
41
+ db_type: Database type ('mongodb' or 'postgres')
42
+ backup_dir: Directory to store backups
43
+ """
44
+ self.db_type = db_type.lower()
45
+ self.backup_dir = Path(backup_dir)
46
+ self.backup_dir.mkdir(exist_ok=True)
47
+
48
+ def create_backup(
49
+ self,
50
+ uri: str,
51
+ database: Optional[str] = None,
52
+ compress: bool = True,
53
+ verify: bool = True
54
+ ) -> Optional[BackupInfo]:
55
+ """
56
+ Create database backup.
57
+
58
+ Args:
59
+ uri: Database connection string
60
+ database: Database name (optional for MongoDB)
61
+ compress: Compress backup file
62
+ verify: Verify backup after creation
63
+
64
+ Returns:
65
+ BackupInfo if successful, None otherwise
66
+ """
67
+ timestamp = datetime.now()
68
+ date_str = timestamp.strftime("%Y%m%d_%H%M%S")
69
+
70
+ if self.db_type == "mongodb":
71
+ return self._backup_mongodb(uri, database, date_str, compress, verify)
72
+ elif self.db_type == "postgres":
73
+ return self._backup_postgres(uri, database, date_str, compress, verify)
74
+ else:
75
+ print(f"Error: Unsupported database type: {self.db_type}")
76
+ return None
77
+
78
+ def _backup_mongodb(
79
+ self,
80
+ uri: str,
81
+ database: Optional[str],
82
+ date_str: str,
83
+ compress: bool,
84
+ verify: bool
85
+ ) -> Optional[BackupInfo]:
86
+ """Create MongoDB backup using mongodump."""
87
+ db_name = database or "all"
88
+ filename = f"mongodb_{db_name}_{date_str}"
89
+ backup_path = self.backup_dir / filename
90
+
91
+ try:
92
+ cmd = ["mongodump", "--uri", uri, "--out", str(backup_path)]
93
+
94
+ if database:
95
+ cmd.extend(["--db", database])
96
+
97
+ print(f"Creating MongoDB backup: {filename}")
98
+ result = subprocess.run(cmd, capture_output=True, text=True)
99
+
100
+ if result.returncode != 0:
101
+ print(f"Error: {result.stderr}")
102
+ return None
103
+
104
+ # Compress if requested
105
+ if compress:
106
+ archive_path = backup_path.with_suffix(".tar.gz")
107
+ print(f"Compressing backup...")
108
+ shutil.make_archive(str(backup_path), "gztar", backup_path)
109
+ shutil.rmtree(backup_path)
110
+ backup_path = archive_path
111
+ filename = archive_path.name
112
+
113
+ size_bytes = self._get_size(backup_path)
114
+
115
+ backup_info = BackupInfo(
116
+ filename=filename,
117
+ database_type="mongodb",
118
+ database_name=db_name,
119
+ timestamp=datetime.now(),
120
+ size_bytes=size_bytes,
121
+ compressed=compress
122
+ )
123
+
124
+ if verify:
125
+ backup_info.verified = self._verify_backup(backup_info)
126
+
127
+ self._save_metadata(backup_info)
128
+ print(f"✓ Backup created: {filename} ({self._format_size(size_bytes)})")
129
+
130
+ return backup_info
131
+
132
+ except Exception as e:
133
+ print(f"Error creating MongoDB backup: {e}")
134
+ return None
135
+
136
+ def _backup_postgres(
137
+ self,
138
+ uri: str,
139
+ database: str,
140
+ date_str: str,
141
+ compress: bool,
142
+ verify: bool
143
+ ) -> Optional[BackupInfo]:
144
+ """Create PostgreSQL backup using pg_dump."""
145
+ if not database:
146
+ print("Error: Database name required for PostgreSQL backup")
147
+ return None
148
+
149
+ ext = ".sql.gz" if compress else ".sql"
150
+ filename = f"postgres_{database}_{date_str}{ext}"
151
+ backup_path = self.backup_dir / filename
152
+
153
+ try:
154
+ cmd = ["pg_dump", uri]
155
+
156
+ if compress:
157
+ # Use pg_dump with gzip
158
+ with open(backup_path, "wb") as f:
159
+ dump_proc = subprocess.Popen(cmd, stdout=subprocess.PIPE)
160
+ gzip_proc = subprocess.Popen(
161
+ ["gzip"],
162
+ stdin=dump_proc.stdout,
163
+ stdout=f
164
+ )
165
+ dump_proc.stdout.close()
166
+ gzip_proc.communicate()
167
+
168
+ if dump_proc.returncode != 0:
169
+ print("Error: pg_dump failed")
170
+ return None
171
+ else:
172
+ with open(backup_path, "w") as f:
173
+ result = subprocess.run(cmd, stdout=f, stderr=subprocess.PIPE, text=True)
174
+
175
+ if result.returncode != 0:
176
+ print(f"Error: {result.stderr}")
177
+ return None
178
+
179
+ size_bytes = backup_path.stat().st_size
180
+
181
+ backup_info = BackupInfo(
182
+ filename=filename,
183
+ database_type="postgres",
184
+ database_name=database,
185
+ timestamp=datetime.now(),
186
+ size_bytes=size_bytes,
187
+ compressed=compress
188
+ )
189
+
190
+ if verify:
191
+ backup_info.verified = self._verify_backup(backup_info)
192
+
193
+ self._save_metadata(backup_info)
194
+ print(f"✓ Backup created: {filename} ({self._format_size(size_bytes)})")
195
+
196
+ return backup_info
197
+
198
+ except Exception as e:
199
+ print(f"Error creating PostgreSQL backup: {e}")
200
+ return None
201
+
202
+ def restore_backup(self, filename: str, uri: str, dry_run: bool = False) -> bool:
203
+ """
204
+ Restore database from backup.
205
+
206
+ Args:
207
+ filename: Backup filename
208
+ uri: Database connection string
209
+ dry_run: If True, only show what would be done
210
+
211
+ Returns:
212
+ True if successful, False otherwise
213
+ """
214
+ backup_path = self.backup_dir / filename
215
+
216
+ if not backup_path.exists():
217
+ print(f"Error: Backup not found: {filename}")
218
+ return False
219
+
220
+ # Load metadata
221
+ metadata_path = backup_path.with_suffix(".json")
222
+ if metadata_path.exists():
223
+ with open(metadata_path) as f:
224
+ metadata = json.load(f)
225
+ print(f"Restoring backup from {metadata['timestamp']}")
226
+ print(f"Database: {metadata['database_name']}")
227
+
228
+ if dry_run:
229
+ print(f"Would restore from: {backup_path}")
230
+ return True
231
+
232
+ print(f"Restoring backup: {filename}")
233
+
234
+ try:
235
+ if self.db_type == "mongodb":
236
+ return self._restore_mongodb(backup_path, uri)
237
+ elif self.db_type == "postgres":
238
+ return self._restore_postgres(backup_path, uri)
239
+ else:
240
+ print(f"Error: Unsupported database type: {self.db_type}")
241
+ return False
242
+
243
+ except Exception as e:
244
+ print(f"Error restoring backup: {e}")
245
+ return False
246
+
247
+ def _restore_mongodb(self, backup_path: Path, uri: str) -> bool:
248
+ """Restore MongoDB backup using mongorestore."""
249
+ try:
250
+ # Extract if compressed
251
+ restore_path = backup_path
252
+ if backup_path.suffix == ".gz":
253
+ print("Extracting backup...")
254
+ extract_path = backup_path.with_suffix("")
255
+ shutil.unpack_archive(backup_path, extract_path)
256
+ restore_path = extract_path
257
+
258
+ cmd = ["mongorestore", "--uri", uri, str(restore_path)]
259
+
260
+ result = subprocess.run(cmd, capture_output=True, text=True)
261
+
262
+ # Cleanup extracted files
263
+ if restore_path != backup_path and restore_path.is_dir():
264
+ shutil.rmtree(restore_path)
265
+
266
+ if result.returncode != 0:
267
+ print(f"Error: {result.stderr}")
268
+ return False
269
+
270
+ print("✓ Restore completed")
271
+ return True
272
+
273
+ except Exception as e:
274
+ print(f"Error restoring MongoDB: {e}")
275
+ return False
276
+
277
+ def _restore_postgres(self, backup_path: Path, uri: str) -> bool:
278
+ """Restore PostgreSQL backup using psql."""
279
+ try:
280
+ if backup_path.suffix == ".gz":
281
+ # Decompress and restore
282
+ with gzip.open(backup_path, "rb") as f:
283
+ cmd = ["psql", uri]
284
+ result = subprocess.run(
285
+ cmd,
286
+ stdin=f,
287
+ capture_output=True,
288
+ text=False
289
+ )
290
+ else:
291
+ with open(backup_path) as f:
292
+ cmd = ["psql", uri]
293
+ result = subprocess.run(
294
+ cmd,
295
+ stdin=f,
296
+ capture_output=True,
297
+ text=True
298
+ )
299
+
300
+ if result.returncode != 0:
301
+ print(f"Error: {result.stderr}")
302
+ return False
303
+
304
+ print("✓ Restore completed")
305
+ return True
306
+
307
+ except Exception as e:
308
+ print(f"Error restoring PostgreSQL: {e}")
309
+ return False
310
+
311
+ def list_backups(self) -> List[BackupInfo]:
312
+ """
313
+ List all backups.
314
+
315
+ Returns:
316
+ List of BackupInfo objects
317
+ """
318
+ backups = []
319
+
320
+ for metadata_file in sorted(self.backup_dir.glob("*.json")):
321
+ try:
322
+ with open(metadata_file) as f:
323
+ data = json.load(f)
324
+
325
+ backup_info = BackupInfo(
326
+ filename=data["filename"],
327
+ database_type=data["database_type"],
328
+ database_name=data["database_name"],
329
+ timestamp=datetime.fromisoformat(data["timestamp"]),
330
+ size_bytes=data["size_bytes"],
331
+ compressed=data["compressed"],
332
+ verified=data.get("verified", False)
333
+ )
334
+ backups.append(backup_info)
335
+ except Exception as e:
336
+ print(f"Error reading metadata {metadata_file}: {e}")
337
+
338
+ return backups
339
+
340
+ def cleanup_old_backups(self, retention_days: int, dry_run: bool = False) -> int:
341
+ """
342
+ Remove backups older than retention period.
343
+
344
+ Args:
345
+ retention_days: Number of days to retain backups
346
+ dry_run: If True, only show what would be deleted
347
+
348
+ Returns:
349
+ Number of backups removed
350
+ """
351
+ cutoff = datetime.now().timestamp() - (retention_days * 24 * 3600)
352
+ removed = 0
353
+
354
+ for backup_file in self.backup_dir.glob("*"):
355
+ if backup_file.suffix == ".json":
356
+ continue
357
+
358
+ if backup_file.stat().st_mtime < cutoff:
359
+ if dry_run:
360
+ print(f"Would remove: {backup_file.name}")
361
+ else:
362
+ print(f"Removing: {backup_file.name}")
363
+ backup_file.unlink()
364
+ # Remove metadata
365
+ metadata_file = backup_file.with_suffix(".json")
366
+ if metadata_file.exists():
367
+ metadata_file.unlink()
368
+ removed += 1
369
+
370
+ return removed
371
+
372
+ def _verify_backup(self, backup_info: BackupInfo) -> bool:
373
+ """
374
+ Verify backup integrity.
375
+
376
+ Args:
377
+ backup_info: Backup information
378
+
379
+ Returns:
380
+ True if backup is valid, False otherwise
381
+ """
382
+ backup_path = self.backup_dir / backup_info.filename
383
+
384
+ if not backup_path.exists():
385
+ return False
386
+
387
+ # Basic verification: file exists and has size > 0
388
+ if backup_path.stat().st_size == 0:
389
+ return False
390
+
391
+ # Could add more verification here (checksums, test restore, etc.)
392
+ return True
393
+
394
+ def _get_size(self, path: Path) -> int:
395
+ """Get total size of file or directory."""
396
+ if path.is_file():
397
+ return path.stat().st_size
398
+ elif path.is_dir():
399
+ total = 0
400
+ for item in path.rglob("*"):
401
+ if item.is_file():
402
+ total += item.stat().st_size
403
+ return total
404
+ return 0
405
+
406
+ def _format_size(self, size_bytes: int) -> str:
407
+ """Format size in human-readable format."""
408
+ for unit in ["B", "KB", "MB", "GB", "TB"]:
409
+ if size_bytes < 1024:
410
+ return f"{size_bytes:.2f} {unit}"
411
+ size_bytes /= 1024
412
+ return f"{size_bytes:.2f} PB"
413
+
414
+ def _save_metadata(self, backup_info: BackupInfo):
415
+ """Save backup metadata to JSON file."""
416
+ metadata_path = self.backup_dir / f"{backup_info.filename}.json"
417
+
418
+ metadata = {
419
+ "filename": backup_info.filename,
420
+ "database_type": backup_info.database_type,
421
+ "database_name": backup_info.database_name,
422
+ "timestamp": backup_info.timestamp.isoformat(),
423
+ "size_bytes": backup_info.size_bytes,
424
+ "compressed": backup_info.compressed,
425
+ "verified": backup_info.verified
426
+ }
427
+
428
+ with open(metadata_path, "w") as f:
429
+ json.dump(metadata, f, indent=2)
430
+
431
+
432
+ def main():
433
+ """Main entry point."""
434
+ parser = argparse.ArgumentParser(description="Database backup tool")
435
+ parser.add_argument("--db", required=True, choices=["mongodb", "postgres"],
436
+ help="Database type")
437
+ parser.add_argument("--backup-dir", default="./backups",
438
+ help="Backup directory")
439
+
440
+ subparsers = parser.add_subparsers(dest="command", required=True)
441
+
442
+ # Backup command
443
+ backup_parser = subparsers.add_parser("backup", help="Create backup")
444
+ backup_parser.add_argument("--uri", required=True, help="Database connection string")
445
+ backup_parser.add_argument("--database", help="Database name")
446
+ backup_parser.add_argument("--no-compress", action="store_true",
447
+ help="Disable compression")
448
+ backup_parser.add_argument("--no-verify", action="store_true",
449
+ help="Skip verification")
450
+
451
+ # Restore command
452
+ restore_parser = subparsers.add_parser("restore", help="Restore backup")
453
+ restore_parser.add_argument("filename", help="Backup filename")
454
+ restore_parser.add_argument("--uri", required=True, help="Database connection string")
455
+ restore_parser.add_argument("--dry-run", action="store_true",
456
+ help="Show what would be done")
457
+
458
+ # List command
459
+ subparsers.add_parser("list", help="List backups")
460
+
461
+ # Cleanup command
462
+ cleanup_parser = subparsers.add_parser("cleanup", help="Remove old backups")
463
+ cleanup_parser.add_argument("--retention-days", type=int, default=7,
464
+ help="Days to retain backups (default: 7)")
465
+ cleanup_parser.add_argument("--dry-run", action="store_true",
466
+ help="Show what would be removed")
467
+
468
+ args = parser.parse_args()
469
+
470
+ manager = BackupManager(args.db, args.backup_dir)
471
+
472
+ if args.command == "backup":
473
+ backup_info = manager.create_backup(
474
+ args.uri,
475
+ args.database,
476
+ compress=not args.no_compress,
477
+ verify=not args.no_verify
478
+ )
479
+ sys.exit(0 if backup_info else 1)
480
+
481
+ elif args.command == "restore":
482
+ success = manager.restore_backup(args.filename, args.uri, args.dry_run)
483
+ sys.exit(0 if success else 1)
484
+
485
+ elif args.command == "list":
486
+ backups = manager.list_backups()
487
+ print(f"Total backups: {len(backups)}\n")
488
+ for backup in backups:
489
+ verified_str = "✓" if backup.verified else "?"
490
+ print(f"[{verified_str}] {backup.filename}")
491
+ print(f" Database: {backup.database_name}")
492
+ print(f" Created: {backup.timestamp}")
493
+ print(f" Size: {manager._format_size(backup.size_bytes)}")
494
+ print()
495
+
496
+ elif args.command == "cleanup":
497
+ removed = manager.cleanup_old_backups(args.retention_days, args.dry_run)
498
+ print(f"Removed {removed} backup(s)")
499
+
500
+
501
+ if __name__ == "__main__":
502
+ main()