@ngockhoale/ukit 1.1.6

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 (344) hide show
  1. package/CHANGELOG.md +179 -0
  2. package/LICENSE +21 -0
  3. package/README.md +189 -0
  4. package/bin/ukit +30 -0
  5. package/manifests/platform.full.yaml +1194 -0
  6. package/package.json +71 -0
  7. package/scripts/bug/triage.mjs +37 -0
  8. package/scripts/index/build-index.mjs +35 -0
  9. package/scripts/index/query-index.mjs +92 -0
  10. package/scripts/index/refresh-index.mjs +85 -0
  11. package/scripts/release/verify-release.mjs +56 -0
  12. package/src/bug/triageBug.js +123 -0
  13. package/src/cli/adapters.js +148 -0
  14. package/src/cli/commands/diff.js +51 -0
  15. package/src/cli/commands/doctor.js +125 -0
  16. package/src/cli/commands/indexArgs.js +73 -0
  17. package/src/cli/commands/indexTools.js +509 -0
  18. package/src/cli/commands/install.js +293 -0
  19. package/src/cli/commands/memory.js +126 -0
  20. package/src/cli/commands/status.js +8 -0
  21. package/src/cli/commands/uninstall.js +51 -0
  22. package/src/cli/index.js +109 -0
  23. package/src/context/detectProjectContext.js +49 -0
  24. package/src/context/detectProviders.js +12 -0
  25. package/src/core/applyPlan.js +89 -0
  26. package/src/core/buildPlan.js +228 -0
  27. package/src/core/compact/index.js +294 -0
  28. package/src/core/compact/threshold.js +936 -0
  29. package/src/core/diffPlan.js +73 -0
  30. package/src/core/ensureGitignore.js +117 -0
  31. package/src/core/fileOps.js +188 -0
  32. package/src/core/memory/hygiene.js +160 -0
  33. package/src/core/memory/index.js +2 -0
  34. package/src/core/memory/retrieval.js +476 -0
  35. package/src/core/memory/store.js +202 -0
  36. package/src/core/metadata.js +132 -0
  37. package/src/core/migrateLegacy.js +139 -0
  38. package/src/core/output/index.js +1309 -0
  39. package/src/core/paths.js +13 -0
  40. package/src/core/report.js +17 -0
  41. package/src/core/router/advisor.js +42 -0
  42. package/src/core/router/index.js +2 -0
  43. package/src/core/router/router.js +164 -0
  44. package/src/core/runInstallPipeline.js +365 -0
  45. package/src/core/runtimeConfig.js +190 -0
  46. package/src/core/runtimePaths.js +24 -0
  47. package/src/core/status.js +186 -0
  48. package/src/core/token/index.js +328 -0
  49. package/src/core/uninstall.js +246 -0
  50. package/src/core/validation/confidence.js +89 -0
  51. package/src/core/validation/index.js +2 -0
  52. package/src/core/validation/validator.js +165 -0
  53. package/src/index/buildIndex.js +1392 -0
  54. package/src/index/gitHooks.js +109 -0
  55. package/src/index/importResolution.js +377 -0
  56. package/src/index/languageTools.js +127 -0
  57. package/src/index/paths.js +27 -0
  58. package/src/index/queryIndex.js +637 -0
  59. package/src/index/relatedTests.js +237 -0
  60. package/src/index/resolveContext.js +345 -0
  61. package/src/index/routeCatalog.js +258 -0
  62. package/src/index/taskRouting.js +677 -0
  63. package/src/index/verificationPlan.js +437 -0
  64. package/src/manifest/loadManifest.js +22 -0
  65. package/src/manifest/selectItems.js +78 -0
  66. package/src/manifest/validateManifest.js +115 -0
  67. package/src/render/buildVariables.js +39 -0
  68. package/src/render/renderTemplate.js +44 -0
  69. package/src/stack/detectStack.js +213 -0
  70. package/templates/.claude/agents/bug-debugger.md +57 -0
  71. package/templates/.claude/agents/feature-implementer.md +55 -0
  72. package/templates/.claude/config/providers.md +25 -0
  73. package/templates/.claude/hooks/auto-allow-bash.sh +155 -0
  74. package/templates/.claude/hooks/auto-prune-bash.sh +75 -0
  75. package/templates/.claude/hooks/block-dangerous.sh +54 -0
  76. package/templates/.claude/hooks/compress-output.sh +17 -0
  77. package/templates/.claude/hooks/protect-files.sh +37 -0
  78. package/templates/.claude/hooks/reinject-context.sh +28 -0
  79. package/templates/.claude/hooks/session-start.md +13 -0
  80. package/templates/.claude/hooks/skill-router.sh +1681 -0
  81. package/templates/.claude/hooks/verification-guard.sh +271 -0
  82. package/templates/.claude/settings.json +144 -0
  83. package/templates/.claude/skills/_shared/ooxml/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +1499 -0
  84. package/templates/.claude/skills/_shared/ooxml/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +146 -0
  85. package/templates/.claude/skills/_shared/ooxml/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +1085 -0
  86. package/templates/.claude/skills/_shared/ooxml/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +11 -0
  87. package/templates/.claude/skills/_shared/ooxml/schemas/ISO-IEC29500-4_2016/dml-main.xsd +3081 -0
  88. package/templates/.claude/skills/_shared/ooxml/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +23 -0
  89. package/templates/.claude/skills/_shared/ooxml/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +185 -0
  90. package/templates/.claude/skills/_shared/ooxml/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +287 -0
  91. package/templates/.claude/skills/_shared/ooxml/schemas/ISO-IEC29500-4_2016/pml.xsd +1676 -0
  92. package/templates/.claude/skills/_shared/ooxml/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +28 -0
  93. package/templates/.claude/skills/_shared/ooxml/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +144 -0
  94. package/templates/.claude/skills/_shared/ooxml/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +174 -0
  95. package/templates/.claude/skills/_shared/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +25 -0
  96. package/templates/.claude/skills/_shared/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +18 -0
  97. package/templates/.claude/skills/_shared/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +59 -0
  98. package/templates/.claude/skills/_shared/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +56 -0
  99. package/templates/.claude/skills/_shared/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +195 -0
  100. package/templates/.claude/skills/_shared/ooxml/schemas/ISO-IEC29500-4_2016/shared-math.xsd +582 -0
  101. package/templates/.claude/skills/_shared/ooxml/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +25 -0
  102. package/templates/.claude/skills/_shared/ooxml/schemas/ISO-IEC29500-4_2016/sml.xsd +4439 -0
  103. package/templates/.claude/skills/_shared/ooxml/schemas/ISO-IEC29500-4_2016/vml-main.xsd +570 -0
  104. package/templates/.claude/skills/_shared/ooxml/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +509 -0
  105. package/templates/.claude/skills/_shared/ooxml/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +12 -0
  106. package/templates/.claude/skills/_shared/ooxml/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +108 -0
  107. package/templates/.claude/skills/_shared/ooxml/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +96 -0
  108. package/templates/.claude/skills/_shared/ooxml/schemas/ISO-IEC29500-4_2016/wml.xsd +3646 -0
  109. package/templates/.claude/skills/_shared/ooxml/schemas/ISO-IEC29500-4_2016/xml.xsd +116 -0
  110. package/templates/.claude/skills/_shared/ooxml/schemas/ecma/fouth-edition/opc-contentTypes.xsd +42 -0
  111. package/templates/.claude/skills/_shared/ooxml/schemas/ecma/fouth-edition/opc-coreProperties.xsd +50 -0
  112. package/templates/.claude/skills/_shared/ooxml/schemas/ecma/fouth-edition/opc-digSig.xsd +49 -0
  113. package/templates/.claude/skills/_shared/ooxml/schemas/ecma/fouth-edition/opc-relationships.xsd +33 -0
  114. package/templates/.claude/skills/_shared/ooxml/schemas/mce/mc.xsd +75 -0
  115. package/templates/.claude/skills/_shared/ooxml/schemas/microsoft/wml-2010.xsd +560 -0
  116. package/templates/.claude/skills/_shared/ooxml/schemas/microsoft/wml-2012.xsd +67 -0
  117. package/templates/.claude/skills/_shared/ooxml/schemas/microsoft/wml-2018.xsd +14 -0
  118. package/templates/.claude/skills/_shared/ooxml/schemas/microsoft/wml-cex-2018.xsd +20 -0
  119. package/templates/.claude/skills/_shared/ooxml/schemas/microsoft/wml-cid-2016.xsd +13 -0
  120. package/templates/.claude/skills/_shared/ooxml/schemas/microsoft/wml-sdtdatahash-2020.xsd +4 -0
  121. package/templates/.claude/skills/_shared/ooxml/schemas/microsoft/wml-symex-2015.xsd +8 -0
  122. package/templates/.claude/skills/_shared/ooxml/scripts/pack.py +159 -0
  123. package/templates/.claude/skills/_shared/ooxml/scripts/unpack.py +29 -0
  124. package/templates/.claude/skills/_shared/ooxml/scripts/validate.py +69 -0
  125. package/templates/.claude/skills/_shared/ooxml/scripts/validation/__init__.py +15 -0
  126. package/templates/.claude/skills/_shared/ooxml/scripts/validation/base.py +951 -0
  127. package/templates/.claude/skills/_shared/ooxml/scripts/validation/docx.py +274 -0
  128. package/templates/.claude/skills/_shared/ooxml/scripts/validation/pptx.py +315 -0
  129. package/templates/.claude/skills/_shared/ooxml/scripts/validation/redlining.py +279 -0
  130. package/templates/.claude/skills/backend-api/SKILL.md +26 -0
  131. package/templates/.claude/skills/canvas-design/LICENSE.txt +202 -0
  132. package/templates/.claude/skills/canvas-design/SKILL.md +130 -0
  133. package/templates/.claude/skills/canvas-design/canvas-fonts/BricolageGrotesque-Bold.ttf +0 -0
  134. package/templates/.claude/skills/canvas-design/canvas-fonts/BricolageGrotesque-OFL.txt +93 -0
  135. package/templates/.claude/skills/canvas-design/canvas-fonts/BricolageGrotesque-Regular.ttf +0 -0
  136. package/templates/.claude/skills/canvas-design/canvas-fonts/InstrumentSans-Bold.ttf +0 -0
  137. package/templates/.claude/skills/canvas-design/canvas-fonts/InstrumentSans-BoldItalic.ttf +0 -0
  138. package/templates/.claude/skills/canvas-design/canvas-fonts/InstrumentSans-Italic.ttf +0 -0
  139. package/templates/.claude/skills/canvas-design/canvas-fonts/InstrumentSans-OFL.txt +93 -0
  140. package/templates/.claude/skills/canvas-design/canvas-fonts/InstrumentSans-Regular.ttf +0 -0
  141. package/templates/.claude/skills/canvas-design/canvas-fonts/InstrumentSerif-Italic.ttf +0 -0
  142. package/templates/.claude/skills/canvas-design/canvas-fonts/InstrumentSerif-Regular.ttf +0 -0
  143. package/templates/.claude/skills/canvas-design/canvas-fonts/JetBrainsMono-Bold.ttf +0 -0
  144. package/templates/.claude/skills/canvas-design/canvas-fonts/JetBrainsMono-OFL.txt +93 -0
  145. package/templates/.claude/skills/canvas-design/canvas-fonts/JetBrainsMono-Regular.ttf +0 -0
  146. package/templates/.claude/skills/canvas-design/canvas-fonts/Lora-Bold.ttf +0 -0
  147. package/templates/.claude/skills/canvas-design/canvas-fonts/Lora-BoldItalic.ttf +0 -0
  148. package/templates/.claude/skills/canvas-design/canvas-fonts/Lora-Italic.ttf +0 -0
  149. package/templates/.claude/skills/canvas-design/canvas-fonts/Lora-OFL.txt +93 -0
  150. package/templates/.claude/skills/canvas-design/canvas-fonts/Lora-Regular.ttf +0 -0
  151. package/templates/.claude/skills/canvas-design/canvas-fonts/NothingYouCouldDo-OFL.txt +93 -0
  152. package/templates/.claude/skills/canvas-design/canvas-fonts/NothingYouCouldDo-Regular.ttf +0 -0
  153. package/templates/.claude/skills/canvas-design/canvas-fonts/Outfit-Bold.ttf +0 -0
  154. package/templates/.claude/skills/canvas-design/canvas-fonts/Outfit-OFL.txt +93 -0
  155. package/templates/.claude/skills/canvas-design/canvas-fonts/Outfit-Regular.ttf +0 -0
  156. package/templates/.claude/skills/canvas-design/canvas-fonts/Tektur-Medium.ttf +0 -0
  157. package/templates/.claude/skills/canvas-design/canvas-fonts/Tektur-OFL.txt +93 -0
  158. package/templates/.claude/skills/canvas-design/canvas-fonts/Tektur-Regular.ttf +0 -0
  159. package/templates/.claude/skills/canvas-design/canvas-fonts/YoungSerif-OFL.txt +93 -0
  160. package/templates/.claude/skills/canvas-design/canvas-fonts/YoungSerif-Regular.ttf +0 -0
  161. package/templates/.claude/skills/code-review/SKILL.md +97 -0
  162. package/templates/.claude/skills/debugging-toolkit/SKILL.md +156 -0
  163. package/templates/.claude/skills/delivery/SKILL.md +92 -0
  164. package/templates/.claude/skills/discover-security/SKILL.md +86 -0
  165. package/templates/.claude/skills/docker-packaging/SKILL.md +60 -0
  166. package/templates/.claude/skills/docs-manager/SKILL.md +465 -0
  167. package/templates/.claude/skills/docs-manager/init-project-docs.sh +70 -0
  168. package/templates/.claude/skills/docs-manager/templates/README.md.template +50 -0
  169. package/templates/.claude/skills/docs-manager/templates/agent-roles.md.template +24 -0
  170. package/templates/.claude/skills/docs-manager/templates/coding-conventions.md.template +28 -0
  171. package/templates/.claude/skills/docs-manager/templates/memory.md.template +30 -0
  172. package/templates/.claude/skills/docs-manager/templates/onboarding.md.template +20 -0
  173. package/templates/.claude/skills/docs-manager/templates/project.md.template +26 -0
  174. package/templates/.claude/skills/docs-quality/SKILL.md +148 -0
  175. package/templates/.claude/skills/docx/LICENSE.txt +30 -0
  176. package/templates/.claude/skills/docx/SKILL.md +197 -0
  177. package/templates/.claude/skills/docx/docx-js.md +350 -0
  178. package/templates/.claude/skills/docx/ooxml.md +610 -0
  179. package/templates/.claude/skills/docx/scripts/__init__.py +1 -0
  180. package/templates/.claude/skills/docx/scripts/document.py +1276 -0
  181. package/templates/.claude/skills/docx/scripts/templates/comments.xml +3 -0
  182. package/templates/.claude/skills/docx/scripts/templates/commentsExtended.xml +3 -0
  183. package/templates/.claude/skills/docx/scripts/templates/commentsExtensible.xml +3 -0
  184. package/templates/.claude/skills/docx/scripts/templates/commentsIds.xml +3 -0
  185. package/templates/.claude/skills/docx/scripts/templates/people.xml +3 -0
  186. package/templates/.claude/skills/docx/scripts/utilities.py +374 -0
  187. package/templates/.claude/skills/duraone/SKILL.md +204 -0
  188. package/templates/.claude/skills/duraone/references/backend.md +636 -0
  189. package/templates/.claude/skills/duraone/references/frontend.md +1506 -0
  190. package/templates/.claude/skills/duraone/references/sql.md +631 -0
  191. package/templates/.claude/skills/duraone/references/workflow.md +520 -0
  192. package/templates/.claude/skills/executing-plans/SKILL.md +76 -0
  193. package/templates/.claude/skills/file-organizer/SKILL.md +433 -0
  194. package/templates/.claude/skills/frontend/SKILL.md +26 -0
  195. package/templates/.claude/skills/frontend-design/LICENSE.txt +177 -0
  196. package/templates/.claude/skills/frontend-design/SKILL.md +42 -0
  197. package/templates/.claude/skills/frontend-vue/SKILL.md +127 -0
  198. package/templates/.claude/skills/frontend-vue/components/Control/Box.vue +137 -0
  199. package/templates/.claude/skills/frontend-vue/components/Control/Button.vue +93 -0
  200. package/templates/.claude/skills/frontend-vue/components/Control/ButtonBar.vue +29 -0
  201. package/templates/.claude/skills/frontend-vue/components/Control/ButtonFloat.vue +62 -0
  202. package/templates/.claude/skills/frontend-vue/components/Control/CheckButton.vue +75 -0
  203. package/templates/.claude/skills/frontend-vue/components/Control/Checkbox.vue +58 -0
  204. package/templates/.claude/skills/frontend-vue/components/Control/Datetime.vue +148 -0
  205. package/templates/.claude/skills/frontend-vue/components/Control/Dropdownlist.vue +156 -0
  206. package/templates/.claude/skills/frontend-vue/components/Control/Input.vue +106 -0
  207. package/templates/.claude/skills/frontend-vue/components/Control/Label.vue +38 -0
  208. package/templates/.claude/skills/frontend-vue/components/Control/Master/BoxColumn.vue +24 -0
  209. package/templates/.claude/skills/frontend-vue/components/Control/Popup/Confirm.vue +33 -0
  210. package/templates/.claude/skills/frontend-vue/components/Control/Popup/Info.vue +32 -0
  211. package/templates/.claude/skills/frontend-vue/components/Control/Popup/ModalInfo.vue +39 -0
  212. package/templates/.claude/skills/frontend-vue/components/Control/Popup/Reject.vue +64 -0
  213. package/templates/.claude/skills/frontend-vue/components/Control/Tag.vue +82 -0
  214. package/templates/.claude/skills/frontend-vue/components/Control/Upload.vue +61 -0
  215. package/templates/.claude/skills/frontend-vue/components/ControlMobile/Dropdownlist.vue +103 -0
  216. package/templates/.claude/skills/frontend-vue/components/ControlMobile/PagingBar.vue +108 -0
  217. package/templates/.claude/skills/frontend-vue/components/ControlMobile/UploadImage.vue +137 -0
  218. package/templates/.claude/skills/frontend-vue/components/Grid/AG.vue +806 -0
  219. package/templates/.claude/skills/frontend-vue/components/Grid/AntTable.vue +253 -0
  220. package/templates/.claude/skills/frontend-vue/components/Grid/CustomDropdownEditor.vue +43 -0
  221. package/templates/.claude/skills/frontend-vue/components/Grid/CustomDropdownEditorEnable.vue +55 -0
  222. package/templates/.claude/skills/frontend-vue/components/Grid/HtmlTable.vue +40 -0
  223. package/templates/.claude/skills/frontend-vue/components/PDFViewer.vue +25 -0
  224. package/templates/.claude/skills/frontend-vue/components/Panel/FormView.vue +309 -0
  225. package/templates/.claude/skills/frontend-vue/components/Partial/Footer.vue +23 -0
  226. package/templates/.claude/skills/frontend-vue/components/Partial/Header.vue +265 -0
  227. package/templates/.claude/skills/frontend-vue/components/Partial/Sidebar.vue +122 -0
  228. package/templates/.claude/skills/frontend-vue/components/Template.vue +16 -0
  229. package/templates/.claude/skills/frontend-vue/components/View/Form.vue +89 -0
  230. package/templates/.claude/skills/frontend-vue/composables/indexDBStore.js +140 -0
  231. package/templates/.claude/skills/frontend-vue/composables/masterApi.js +362 -0
  232. package/templates/.claude/skills/frontend-vue/composables/state.js +578 -0
  233. package/templates/.claude/skills/frontend-vue/composables/useRequest.js +221 -0
  234. package/templates/.claude/skills/frontend-vue/composables/useSession.js +179 -0
  235. package/templates/.claude/skills/frontend-vue/composables/useTranslation.js +54 -0
  236. package/templates/.claude/skills/frontend-vue/composables/useWebSocket.js +257 -0
  237. package/templates/.claude/skills/frontend-vue/composables/userObj.js +111 -0
  238. package/templates/.claude/skills/frontend-vue/composables/utils.js +322 -0
  239. package/templates/.claude/skills/frontend-vue/reference/composables-example.vue +320 -0
  240. package/templates/.claude/skills/frontend-vue/reference/form-example.vue +183 -0
  241. package/templates/.claude/skills/frontend-vue/reference/grid-example.vue +147 -0
  242. package/templates/.claude/skills/frontend-vue/reference/masterdata-example/[id].vue +106 -0
  243. package/templates/.claude/skills/frontend-vue/reference/masterdata-example/index.vue +58 -0
  244. package/templates/.claude/skills/frontend-vue/reference/popup-example.vue +159 -0
  245. package/templates/.claude/skills/pdf/LICENSE.txt +30 -0
  246. package/templates/.claude/skills/pdf/SKILL.md +294 -0
  247. package/templates/.claude/skills/pdf/forms.md +205 -0
  248. package/templates/.claude/skills/pdf/reference.md +612 -0
  249. package/templates/.claude/skills/pdf/scripts/check_bounding_boxes.py +70 -0
  250. package/templates/.claude/skills/pdf/scripts/check_bounding_boxes_test.py +226 -0
  251. package/templates/.claude/skills/pdf/scripts/check_fillable_fields.py +12 -0
  252. package/templates/.claude/skills/pdf/scripts/convert_pdf_to_images.py +35 -0
  253. package/templates/.claude/skills/pdf/scripts/create_validation_image.py +41 -0
  254. package/templates/.claude/skills/pdf/scripts/extract_form_field_info.py +152 -0
  255. package/templates/.claude/skills/pdf/scripts/fill_fillable_fields.py +114 -0
  256. package/templates/.claude/skills/pdf/scripts/fill_pdf_form_with_annotations.py +108 -0
  257. package/templates/.claude/skills/pdf-processing/SKILL.md +107 -0
  258. package/templates/.claude/skills/pdf-processing-pro/FORMS.md +610 -0
  259. package/templates/.claude/skills/pdf-processing-pro/OCR.md +137 -0
  260. package/templates/.claude/skills/pdf-processing-pro/SKILL.md +296 -0
  261. package/templates/.claude/skills/pdf-processing-pro/TABLES.md +626 -0
  262. package/templates/.claude/skills/pdf-processing-pro/scripts/analyze_form.py +307 -0
  263. package/templates/.claude/skills/postgres/SKILL.md +69 -0
  264. package/templates/.claude/skills/postgres/reference/fn_get_examples.sql +208 -0
  265. package/templates/.claude/skills/postgres/reference/fn_rpt_examples.sql +239 -0
  266. package/templates/.claude/skills/postgres/reference/utility_functions.sql +94 -0
  267. package/templates/.claude/skills/pptx/LICENSE.txt +30 -0
  268. package/templates/.claude/skills/pptx/SKILL.md +484 -0
  269. package/templates/.claude/skills/pptx/html2pptx.md +625 -0
  270. package/templates/.claude/skills/pptx/ooxml.md +427 -0
  271. package/templates/.claude/skills/pptx/scripts/html2pptx.js +979 -0
  272. package/templates/.claude/skills/pptx/scripts/inventory.py +1020 -0
  273. package/templates/.claude/skills/pptx/scripts/rearrange.py +231 -0
  274. package/templates/.claude/skills/pptx/scripts/replace.py +385 -0
  275. package/templates/.claude/skills/pptx/scripts/thumbnail.py +450 -0
  276. package/templates/.claude/skills/repo-maintenance/SKILL.md +97 -0
  277. package/templates/.claude/skills/research/EXAMPLES.md +434 -0
  278. package/templates/.claude/skills/research/REFERENCE.md +399 -0
  279. package/templates/.claude/skills/research/SKILL.md +136 -0
  280. package/templates/.claude/skills/root-cause-tracing/SKILL.md +174 -0
  281. package/templates/.claude/skills/root-cause-tracing/find-polluter.sh +63 -0
  282. package/templates/.claude/skills/sharing-skills/SKILL.md +194 -0
  283. package/templates/.claude/skills/sql-optimization-patterns/SKILL.md +493 -0
  284. package/templates/.claude/skills/subagent-driven-development/SKILL.md +189 -0
  285. package/templates/.claude/skills/systematic-debugging/CREATION-LOG.md +119 -0
  286. package/templates/.claude/skills/systematic-debugging/SKILL.md +295 -0
  287. package/templates/.claude/skills/systematic-debugging/test-academic.md +14 -0
  288. package/templates/.claude/skills/systematic-debugging/test-pressure-1.md +58 -0
  289. package/templates/.claude/skills/systematic-debugging/test-pressure-2.md +68 -0
  290. package/templates/.claude/skills/systematic-debugging/test-pressure-3.md +69 -0
  291. package/templates/.claude/skills/test-driven-development/SKILL.md +364 -0
  292. package/templates/.claude/skills/testing-anti-patterns/SKILL.md +302 -0
  293. package/templates/.claude/skills/testing-quality/SKILL.md +97 -0
  294. package/templates/.claude/skills/verification-before-completion/SKILL.md +139 -0
  295. package/templates/.claude/skills/webapp-testing/LICENSE.txt +202 -0
  296. package/templates/.claude/skills/webapp-testing/SKILL.md +96 -0
  297. package/templates/.claude/skills/webapp-testing/examples/console_logging.py +35 -0
  298. package/templates/.claude/skills/webapp-testing/examples/element_discovery.py +40 -0
  299. package/templates/.claude/skills/webapp-testing/examples/static_html_automation.py +33 -0
  300. package/templates/.claude/skills/webapp-testing/scripts/with_server.py +106 -0
  301. package/templates/.claude/ukit/index/build-index.mjs +28 -0
  302. package/templates/.claude/ukit/index/cache-utils.mjs +140 -0
  303. package/templates/.claude/ukit/index/lib/index-core.mjs +2800 -0
  304. package/templates/.claude/ukit/index/query-index.mjs +150 -0
  305. package/templates/.claude/ukit/index/refresh-index.mjs +57 -0
  306. package/templates/.claude/ukit/index/reset-auto-permissions.mjs +76 -0
  307. package/templates/.claude/ukit/index/resolve-context.mjs +279 -0
  308. package/templates/.claude/ukit/index/route-catalog.mjs +258 -0
  309. package/templates/.claude/ukit/index/route-task.mjs +1994 -0
  310. package/templates/.claude/ukit/index/triage.mjs +133 -0
  311. package/templates/.claude/ukit/index/verify-context.mjs +689 -0
  312. package/templates/.claude/ukit/runtime/compact-threshold.mjs +1013 -0
  313. package/templates/.claude/ukit/runtime/output-compression.mjs +1340 -0
  314. package/templates/.claude/ukit/runtime/reinject-context.mjs +874 -0
  315. package/templates/.claude/ukit/runtime/token-utils.mjs +500 -0
  316. package/templates/.codex/README.md +83 -0
  317. package/templates/.codex/settings.json +187 -0
  318. package/templates/.gitignore +75 -0
  319. package/templates/AGENTS.md +116 -0
  320. package/templates/CLAUDE.md +93 -0
  321. package/templates/adapter-presets/antigravity/README.md +22 -0
  322. package/templates/adapter-presets/antigravity/rules.md +49 -0
  323. package/templates/adapter-presets/claude/settings.local.json +42 -0
  324. package/templates/adapter-presets/codex/settings.local.json +6 -0
  325. package/templates/adapter-presets/opencode/opencode.template.json +1 -0
  326. package/templates/docs/BUGFIX.md +20 -0
  327. package/templates/docs/BUG_INDEX.md +12 -0
  328. package/templates/docs/BUG_METRICS.md +7 -0
  329. package/templates/docs/BUG_TEMPLATE.md +13 -0
  330. package/templates/docs/CODE_MAP.md +35 -0
  331. package/templates/docs/INSTALL.md +113 -0
  332. package/templates/docs/MEMORY.md +49 -0
  333. package/templates/docs/PROJECT.md +50 -0
  334. package/templates/docs/UKIT_USAGE_GUIDE.md +147 -0
  335. package/templates/docs/WORKLOG.md +10 -0
  336. package/templates/ukit/README.md +14 -0
  337. package/templates/ukit/storage/cache/compact-history.json +3 -0
  338. package/templates/ukit/storage/cache/compact-pressure.json +1 -0
  339. package/templates/ukit/storage/cache/output-history.json +3 -0
  340. package/templates/ukit/storage/cache/prompt-cache.json +3 -0
  341. package/templates/ukit/storage/config.json +37 -0
  342. package/templates/ukit/storage/memory/projects/.gitkeep +2 -0
  343. package/templates/ukit/storage/memory/sessions/.gitkeep +0 -0
  344. package/templates/ukit/storage/memory/user.json +5 -0
@@ -0,0 +1,106 @@
1
+ <template>
2
+ <div class="col-12">
3
+ <div class="row mt-2">
4
+ <div class="col-12">
5
+ <div class="row">
6
+ <div class="col-12">
7
+ <ControlInput :name="t('Name')" id="name" :required="true" v-model="workingObj.name" />
8
+ </div>
9
+ </div>
10
+ <div class="row">
11
+ <div class="col-12">
12
+ <ControlDropdownlist :name="t('Type')" id="type" :required="true" v-model="workingObj.modern_trade" :list="modernTradeList" />
13
+ </div>
14
+ </div>
15
+ </div>
16
+ </div>
17
+ <div class="row">
18
+ <div class="mt-2 mb-2 col-12">
19
+ <div class="d-flex justify-content-between text-center">
20
+ <ControlButton type="secondary" :name="t('Close')" @onClick="clickClose()" />
21
+ <ControlButton type="danger" :name="t('Delete')" @onClick="showConfirmDelete()" />
22
+ <ControlButton type="success" :name="t('Save')" @onClick="clickSave()" />
23
+ </div>
24
+ </div>
25
+ </div>
26
+ </div>
27
+ <ControlPopupConfirm :visible="show_confirm_delete" :title="t('Confirm')" :message="t('Are you sure to delete this record?')" @onClose="onClose" @onConfirm="clickDelete" />
28
+ </template>
29
+ <script>
30
+ export default {
31
+ data() {
32
+ return {
33
+ workingObj: {},
34
+ modernTradeList: [],
35
+ table: "branch",
36
+ id_field_name: "id_branch",
37
+ show_confirm_delete: false,
38
+ required_fields: ['name', 'modern_trade']
39
+ };
40
+ },
41
+ methods: {
42
+ onClose(){
43
+ this.show_confirm_delete = false;
44
+ },
45
+ showConfirmDelete(){
46
+ this.show_confirm_delete = true;
47
+ },
48
+ async clickClose() {
49
+ this.$router.back();
50
+ },
51
+ async clickDelete() {
52
+ let data = this.workingObj;
53
+ data["schema"] = get_schema();
54
+ data["table"] = this.table;
55
+ await request("/hard_delete", data);
56
+ show_message("success", t("Data is Deleted"));
57
+ this.clickClose();
58
+ },
59
+ async clickSave() {
60
+ for (let field of this.required_fields) {
61
+ if (check_is_null_or_blank(this.workingObj[field])) {
62
+ show_message("error", field + ' ' + t(`is required`));
63
+ return;
64
+ }
65
+ }
66
+ let data = this.workingObj;
67
+ data["schema"] = get_schema();
68
+ data["table"] = this.table;
69
+ await request("/save", data);
70
+ show_message("success", t("Data is Saved"));
71
+ this.clickClose();
72
+ },
73
+ async get_data(id) {
74
+ let conditions = {};
75
+ conditions[this.id_field_name] = id;
76
+ let data = {
77
+ schema: get_schema(),
78
+ table: this.table,
79
+ conditions: JSON.stringify(conditions),
80
+ };
81
+ let resp = await request("/select", data, "get");
82
+ if (resp.length > 0) {
83
+ this.workingObj = resp[0];
84
+ }
85
+ },
86
+ async get_modern_trade_list() {
87
+ let data = {
88
+ schema: get_schema(),
89
+ table: "modern_trade",
90
+ };
91
+ let resp = await request("/select", data, "get");
92
+ this.modernTradeList = convertToDropdownValue(resp, "name", "name");
93
+ },
94
+ },
95
+ async created() {
96
+ let id_params = this.$route.params.id;
97
+ if (id_params === "add") {
98
+ this.workingObj = {};
99
+ } else {
100
+ await this.get_data(id_params);
101
+ }
102
+ await this.get_modern_trade_list();
103
+ },
104
+ };
105
+ </script>
106
+
@@ -0,0 +1,58 @@
1
+ <template>
2
+ <div>
3
+ <ClientOnly>
4
+ <GridAG
5
+ id="gridag"
6
+ ref="gridag"
7
+ :columns="columns"
8
+ :rows="rows"
9
+ @onClickDetail="onClickDetail"
10
+ @onAdd="onAdd"
11
+ @reloadData="get_data"
12
+ :can_add="true"
13
+ :can_edit="true"
14
+ :can_delete="true"
15
+ :can_sync="false"
16
+ :can_upload="false"
17
+ :height="screen_height() - 125"
18
+ :table_schema="get_schema()"
19
+ :table="table"
20
+ />
21
+ </ClientOnly>
22
+ </div>
23
+ </template>
24
+ <script>
25
+ export default {
26
+ data() {
27
+ return {
28
+ columns: [
29
+ {"key": "name", "title": t('Name'),},
30
+ {"key": "modern_trade", "title": t('Modern Trade'),},
31
+ ],
32
+ rows: [],
33
+ table: "branch",
34
+ id_field_name: "id_branch",
35
+ };
36
+ },
37
+ methods: {
38
+ async onClickDetail(obj) {
39
+ this.$router.push({ path: "/master/branch/" + obj[this.id_field_name] });
40
+ },
41
+ async onAdd() {
42
+ this.$router.push({ path: "/master/branch/add" });
43
+ },
44
+ async get_data() {
45
+ let data = {
46
+ schema: get_schema(),
47
+ table: this.table,
48
+ };
49
+ this.rows = await request("/select", data, "get");
50
+ },
51
+
52
+ },
53
+ async created() {
54
+ this.get_data();
55
+ },
56
+ };
57
+ </script>
58
+
@@ -0,0 +1,159 @@
1
+ <!--
2
+ REFERENCE EXAMPLE: Popup/Modal Components
3
+ This example demonstrates how to use popup components from Control/Popup/
4
+ -->
5
+ <template>
6
+ <div class="container mt-4">
7
+ <!-- Buttons to trigger popups -->
8
+ <div class="row mb-4">
9
+ <div class="col-12">
10
+ <ControlButton
11
+ type="primary"
12
+ name="Show Info"
13
+ @onClick="showInfo"
14
+ />
15
+ <ControlButton
16
+ type="warning"
17
+ name="Confirm Action"
18
+ @onClick="showConfirm"
19
+ />
20
+ <ControlButton
21
+ type="danger"
22
+ name="Reject Item"
23
+ @onClick="showReject"
24
+ />
25
+ </div>
26
+ </div>
27
+
28
+ <!-- Info Popup -->
29
+ <ControlPopupInfo
30
+ :visible="show_info"
31
+ title="Information"
32
+ message="This is an informational message for the user."
33
+ @onClose="onCloseInfo"
34
+ />
35
+
36
+ <!-- Confirm Popup -->
37
+ <ControlPopupConfirm
38
+ :visible="show_confirm"
39
+ :title="t('Confirm')"
40
+ :message="t('Are you sure you want to proceed with this action?')"
41
+ @onClose="onCloseConfirm"
42
+ @onConfirm="onConfirmAction"
43
+ />
44
+
45
+ <!-- Reject Popup (with reason input) -->
46
+ <ControlPopupReject
47
+ :visible="show_reject"
48
+ title="Reject Item"
49
+ message="Please provide a reason for rejection:"
50
+ @onClose="onCloseReject"
51
+ @onConfirm="onConfirmReject"
52
+ />
53
+
54
+ <!-- Modal Info (larger modal) -->
55
+ <ControlPopupModalInfo
56
+ :visible="show_modal"
57
+ title="Detail Information"
58
+ @onClose="onCloseModal"
59
+ >
60
+ <!-- Custom content inside modal -->
61
+ <template #content>
62
+ <div class="p-3">
63
+ <p>Custom modal content goes here.</p>
64
+ <p>You can add any HTML or components.</p>
65
+ </div>
66
+ </template>
67
+ </ControlPopupModalInfo>
68
+ </div>
69
+ </template>
70
+
71
+ <script>
72
+ export default {
73
+ computed: {
74
+ // Computed properties first
75
+ },
76
+ data() {
77
+ return {
78
+ show_info: false,
79
+ show_confirm: false,
80
+ show_reject: false,
81
+ show_modal: false,
82
+ };
83
+ },
84
+
85
+ methods: {
86
+ // Info popup methods
87
+ showInfo() {
88
+ this.show_info = true;
89
+ },
90
+ onCloseInfo() {
91
+ this.show_info = false;
92
+ },
93
+
94
+ // Confirm popup methods
95
+ showConfirm() {
96
+ this.show_confirm = true;
97
+ },
98
+ onCloseConfirm() {
99
+ this.show_confirm = false;
100
+ },
101
+ async onConfirmAction() {
102
+ // Perform the confirmed action
103
+ console.log("Action confirmed");
104
+
105
+ // Example: Delete record
106
+ // let data = {
107
+ // schema: get_schema(),
108
+ // table: "items",
109
+ // id_items: this.selected_id,
110
+ // };
111
+ // await request("/hard_delete", data);
112
+
113
+ this.show_confirm = false;
114
+ },
115
+
116
+ // Reject popup methods
117
+ showReject() {
118
+ this.show_reject = true;
119
+ },
120
+ onCloseReject() {
121
+ this.show_reject = false;
122
+ },
123
+ async onConfirmReject(reason) {
124
+ // Handle rejection with reason
125
+ console.log("Rejected with reason:", reason);
126
+
127
+ // Example: Update record status
128
+ // let data = {
129
+ // schema: get_schema(),
130
+ // table: "items",
131
+ // data: JSON.stringify({
132
+ // id_items: this.selected_id,
133
+ // status: "rejected",
134
+ // reject_reason: reason,
135
+ // }),
136
+ // };
137
+ // await request("/update", data, "post");
138
+
139
+ this.show_reject = false;
140
+ },
141
+
142
+ // Modal methods
143
+ showModal() {
144
+ this.show_modal = true;
145
+ },
146
+ onCloseModal() {
147
+ this.show_modal = false;
148
+ },
149
+ },
150
+
151
+ async mounted() {
152
+ // Initialize if needed
153
+ },
154
+
155
+ watch: {
156
+ // Watchers here
157
+ },
158
+ };
159
+ </script>
@@ -0,0 +1,30 @@
1
+ © 2025 Anthropic, PBC. All rights reserved.
2
+
3
+ LICENSE: Use of these materials (including all code, prompts, assets, files,
4
+ and other components of this Skill) is governed by your agreement with
5
+ Anthropic regarding use of Anthropic's services. If no separate agreement
6
+ exists, use is governed by Anthropic's Consumer Terms of Service or
7
+ Commercial Terms of Service, as applicable:
8
+ https://www.anthropic.com/legal/consumer-terms
9
+ https://www.anthropic.com/legal/commercial-terms
10
+ Your applicable agreement is referred to as the "Agreement." "Services" are
11
+ as defined in the Agreement.
12
+
13
+ ADDITIONAL RESTRICTIONS: Notwithstanding anything in the Agreement to the
14
+ contrary, users may not:
15
+
16
+ - Extract these materials from the Services or retain copies of these
17
+ materials outside the Services
18
+ - Reproduce or copy these materials, except for temporary copies created
19
+ automatically during authorized use of the Services
20
+ - Create derivative works based on these materials
21
+ - Distribute, sublicense, or transfer these materials to any third party
22
+ - Make, offer to sell, sell, or import any inventions embodied in these
23
+ materials
24
+ - Reverse engineer, decompile, or disassemble these materials
25
+
26
+ The receipt, viewing, or possession of these materials does not convey or
27
+ imply any license or right beyond those expressly granted above.
28
+
29
+ Anthropic retains all right, title, and interest in these materials,
30
+ including all copyrights, patents, and other intellectual property rights.
@@ -0,0 +1,294 @@
1
+ ---
2
+ name: pdf
3
+ description: Comprehensive PDF manipulation toolkit for extracting text and tables, creating new PDFs, merging/splitting documents, and handling forms. When Claude needs to fill in a PDF form or programmatically process, generate, or analyze PDF documents at scale.
4
+ license: Proprietary. LICENSE.txt has complete terms
5
+ ---
6
+
7
+ # PDF Processing Guide
8
+
9
+ ## Overview
10
+
11
+ This guide covers essential PDF processing operations using Python libraries and command-line tools. For advanced features, JavaScript libraries, and detailed examples, see reference.md. If you need to fill out a PDF form, read forms.md and follow its instructions.
12
+
13
+ ## Quick Start
14
+
15
+ ```python
16
+ from pypdf import PdfReader, PdfWriter
17
+
18
+ # Read a PDF
19
+ reader = PdfReader("document.pdf")
20
+ print(f"Pages: {len(reader.pages)}")
21
+
22
+ # Extract text
23
+ text = ""
24
+ for page in reader.pages:
25
+ text += page.extract_text()
26
+ ```
27
+
28
+ ## Python Libraries
29
+
30
+ ### pypdf - Basic Operations
31
+
32
+ #### Merge PDFs
33
+ ```python
34
+ from pypdf import PdfWriter, PdfReader
35
+
36
+ writer = PdfWriter()
37
+ for pdf_file in ["doc1.pdf", "doc2.pdf", "doc3.pdf"]:
38
+ reader = PdfReader(pdf_file)
39
+ for page in reader.pages:
40
+ writer.add_page(page)
41
+
42
+ with open("merged.pdf", "wb") as output:
43
+ writer.write(output)
44
+ ```
45
+
46
+ #### Split PDF
47
+ ```python
48
+ reader = PdfReader("input.pdf")
49
+ for i, page in enumerate(reader.pages):
50
+ writer = PdfWriter()
51
+ writer.add_page(page)
52
+ with open(f"page_{i+1}.pdf", "wb") as output:
53
+ writer.write(output)
54
+ ```
55
+
56
+ #### Extract Metadata
57
+ ```python
58
+ reader = PdfReader("document.pdf")
59
+ meta = reader.metadata
60
+ print(f"Title: {meta.title}")
61
+ print(f"Author: {meta.author}")
62
+ print(f"Subject: {meta.subject}")
63
+ print(f"Creator: {meta.creator}")
64
+ ```
65
+
66
+ #### Rotate Pages
67
+ ```python
68
+ reader = PdfReader("input.pdf")
69
+ writer = PdfWriter()
70
+
71
+ page = reader.pages[0]
72
+ page.rotate(90) # Rotate 90 degrees clockwise
73
+ writer.add_page(page)
74
+
75
+ with open("rotated.pdf", "wb") as output:
76
+ writer.write(output)
77
+ ```
78
+
79
+ ### pdfplumber - Text and Table Extraction
80
+
81
+ #### Extract Text with Layout
82
+ ```python
83
+ import pdfplumber
84
+
85
+ with pdfplumber.open("document.pdf") as pdf:
86
+ for page in pdf.pages:
87
+ text = page.extract_text()
88
+ print(text)
89
+ ```
90
+
91
+ #### Extract Tables
92
+ ```python
93
+ with pdfplumber.open("document.pdf") as pdf:
94
+ for i, page in enumerate(pdf.pages):
95
+ tables = page.extract_tables()
96
+ for j, table in enumerate(tables):
97
+ print(f"Table {j+1} on page {i+1}:")
98
+ for row in table:
99
+ print(row)
100
+ ```
101
+
102
+ #### Advanced Table Extraction
103
+ ```python
104
+ import pandas as pd
105
+
106
+ with pdfplumber.open("document.pdf") as pdf:
107
+ all_tables = []
108
+ for page in pdf.pages:
109
+ tables = page.extract_tables()
110
+ for table in tables:
111
+ if table: # Check if table is not empty
112
+ df = pd.DataFrame(table[1:], columns=table[0])
113
+ all_tables.append(df)
114
+
115
+ # Combine all tables
116
+ if all_tables:
117
+ combined_df = pd.concat(all_tables, ignore_index=True)
118
+ combined_df.to_excel("extracted_tables.xlsx", index=False)
119
+ ```
120
+
121
+ ### reportlab - Create PDFs
122
+
123
+ #### Basic PDF Creation
124
+ ```python
125
+ from reportlab.lib.pagesizes import letter
126
+ from reportlab.pdfgen import canvas
127
+
128
+ c = canvas.Canvas("hello.pdf", pagesize=letter)
129
+ width, height = letter
130
+
131
+ # Add text
132
+ c.drawString(100, height - 100, "Hello World!")
133
+ c.drawString(100, height - 120, "This is a PDF created with reportlab")
134
+
135
+ # Add a line
136
+ c.line(100, height - 140, 400, height - 140)
137
+
138
+ # Save
139
+ c.save()
140
+ ```
141
+
142
+ #### Create PDF with Multiple Pages
143
+ ```python
144
+ from reportlab.lib.pagesizes import letter
145
+ from reportlab.platypus import SimpleDocTemplate, Paragraph, Spacer, PageBreak
146
+ from reportlab.lib.styles import getSampleStyleSheet
147
+
148
+ doc = SimpleDocTemplate("report.pdf", pagesize=letter)
149
+ styles = getSampleStyleSheet()
150
+ story = []
151
+
152
+ # Add content
153
+ title = Paragraph("Report Title", styles['Title'])
154
+ story.append(title)
155
+ story.append(Spacer(1, 12))
156
+
157
+ body = Paragraph("This is the body of the report. " * 20, styles['Normal'])
158
+ story.append(body)
159
+ story.append(PageBreak())
160
+
161
+ # Page 2
162
+ story.append(Paragraph("Page 2", styles['Heading1']))
163
+ story.append(Paragraph("Content for page 2", styles['Normal']))
164
+
165
+ # Build PDF
166
+ doc.build(story)
167
+ ```
168
+
169
+ ## Command-Line Tools
170
+
171
+ ### pdftotext (poppler-utils)
172
+ ```bash
173
+ # Extract text
174
+ pdftotext input.pdf output.txt
175
+
176
+ # Extract text preserving layout
177
+ pdftotext -layout input.pdf output.txt
178
+
179
+ # Extract specific pages
180
+ pdftotext -f 1 -l 5 input.pdf output.txt # Pages 1-5
181
+ ```
182
+
183
+ ### qpdf
184
+ ```bash
185
+ # Merge PDFs
186
+ qpdf --empty --pages file1.pdf file2.pdf -- merged.pdf
187
+
188
+ # Split pages
189
+ qpdf input.pdf --pages . 1-5 -- pages1-5.pdf
190
+ qpdf input.pdf --pages . 6-10 -- pages6-10.pdf
191
+
192
+ # Rotate pages
193
+ qpdf input.pdf output.pdf --rotate=+90:1 # Rotate page 1 by 90 degrees
194
+
195
+ # Remove password
196
+ qpdf --password=mypassword --decrypt encrypted.pdf decrypted.pdf
197
+ ```
198
+
199
+ ### pdftk (if available)
200
+ ```bash
201
+ # Merge
202
+ pdftk file1.pdf file2.pdf cat output merged.pdf
203
+
204
+ # Split
205
+ pdftk input.pdf burst
206
+
207
+ # Rotate
208
+ pdftk input.pdf rotate 1east output rotated.pdf
209
+ ```
210
+
211
+ ## Common Tasks
212
+
213
+ ### Extract Text from Scanned PDFs
214
+ ```python
215
+ # Requires: pip install pytesseract pdf2image
216
+ import pytesseract
217
+ from pdf2image import convert_from_path
218
+
219
+ # Convert PDF to images
220
+ images = convert_from_path('scanned.pdf')
221
+
222
+ # OCR each page
223
+ text = ""
224
+ for i, image in enumerate(images):
225
+ text += f"Page {i+1}:\n"
226
+ text += pytesseract.image_to_string(image)
227
+ text += "\n\n"
228
+
229
+ print(text)
230
+ ```
231
+
232
+ ### Add Watermark
233
+ ```python
234
+ from pypdf import PdfReader, PdfWriter
235
+
236
+ # Create watermark (or load existing)
237
+ watermark = PdfReader("watermark.pdf").pages[0]
238
+
239
+ # Apply to all pages
240
+ reader = PdfReader("document.pdf")
241
+ writer = PdfWriter()
242
+
243
+ for page in reader.pages:
244
+ page.merge_page(watermark)
245
+ writer.add_page(page)
246
+
247
+ with open("watermarked.pdf", "wb") as output:
248
+ writer.write(output)
249
+ ```
250
+
251
+ ### Extract Images
252
+ ```bash
253
+ # Using pdfimages (poppler-utils)
254
+ pdfimages -j input.pdf output_prefix
255
+
256
+ # This extracts all images as output_prefix-000.jpg, output_prefix-001.jpg, etc.
257
+ ```
258
+
259
+ ### Password Protection
260
+ ```python
261
+ from pypdf import PdfReader, PdfWriter
262
+
263
+ reader = PdfReader("input.pdf")
264
+ writer = PdfWriter()
265
+
266
+ for page in reader.pages:
267
+ writer.add_page(page)
268
+
269
+ # Add password
270
+ writer.encrypt("userpassword", "ownerpassword")
271
+
272
+ with open("encrypted.pdf", "wb") as output:
273
+ writer.write(output)
274
+ ```
275
+
276
+ ## Quick Reference
277
+
278
+ | Task | Best Tool | Command/Code |
279
+ |------|-----------|--------------|
280
+ | Merge PDFs | pypdf | `writer.add_page(page)` |
281
+ | Split PDFs | pypdf | One page per file |
282
+ | Extract text | pdfplumber | `page.extract_text()` |
283
+ | Extract tables | pdfplumber | `page.extract_tables()` |
284
+ | Create PDFs | reportlab | Canvas or Platypus |
285
+ | Command line merge | qpdf | `qpdf --empty --pages ...` |
286
+ | OCR scanned PDFs | pytesseract | Convert to image first |
287
+ | Fill PDF forms | pdf-lib or pypdf (see forms.md) | See forms.md |
288
+
289
+ ## Next Steps
290
+
291
+ - For advanced pypdfium2 usage, see reference.md
292
+ - For JavaScript libraries (pdf-lib), see reference.md
293
+ - If you need to fill out a PDF form, follow the instructions in forms.md
294
+ - For troubleshooting guides, see reference.md