anymous 1.2.7 → 1.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/anymous.cjs +1 -1
- package/package.json +1 -1
- package/script/postinstall.mjs +214 -0
- package/skills/algorithmic-art/LICENSE.txt +202 -0
- package/skills/algorithmic-art/SKILL.md +405 -0
- package/skills/algorithmic-art/templates/generator_template.js +223 -0
- package/skills/algorithmic-art/templates/viewer.html +599 -0
- package/skills/artifacts-builder/LICENSE.txt +202 -0
- package/skills/artifacts-builder/SKILL.md +74 -0
- package/skills/artifacts-builder/scripts/bundle-artifact.sh +54 -0
- package/skills/artifacts-builder/scripts/init-artifact.sh +322 -0
- package/skills/artifacts-builder/scripts/shadcn-components.tar.gz +0 -0
- package/skills/brainstorming/SKILL.md +151 -0
- package/skills/brainstorming/scripts/frame-template.html +213 -0
- package/skills/brainstorming/scripts/helper.js +167 -0
- package/skills/brainstorming/scripts/server.cjs +723 -0
- package/skills/brainstorming/scripts/start-server.sh +209 -0
- package/skills/brainstorming/scripts/stop-server.sh +120 -0
- package/skills/brainstorming/spec-document-reviewer-prompt.md +49 -0
- package/skills/brainstorming/visual-companion.md +298 -0
- package/skills/brand-guidelines/LICENSE.txt +202 -0
- package/skills/brand-guidelines/SKILL.md +73 -0
- package/skills/canvas-design/LICENSE.txt +202 -0
- package/skills/canvas-design/SKILL.md +130 -0
- package/skills/canvas-design/canvas-fonts/ArsenalSC-OFL.txt +93 -0
- package/skills/canvas-design/canvas-fonts/ArsenalSC-Regular.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/BigShoulders-Bold.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/BigShoulders-OFL.txt +93 -0
- package/skills/canvas-design/canvas-fonts/BigShoulders-Regular.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/Boldonse-OFL.txt +93 -0
- package/skills/canvas-design/canvas-fonts/Boldonse-Regular.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/BricolageGrotesque-Bold.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/BricolageGrotesque-OFL.txt +93 -0
- package/skills/canvas-design/canvas-fonts/BricolageGrotesque-Regular.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/CrimsonPro-Bold.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/CrimsonPro-Italic.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/CrimsonPro-OFL.txt +93 -0
- package/skills/canvas-design/canvas-fonts/CrimsonPro-Regular.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/DMMono-OFL.txt +93 -0
- package/skills/canvas-design/canvas-fonts/DMMono-Regular.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/EricaOne-OFL.txt +94 -0
- package/skills/canvas-design/canvas-fonts/EricaOne-Regular.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/GeistMono-Bold.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/GeistMono-OFL.txt +93 -0
- package/skills/canvas-design/canvas-fonts/GeistMono-Regular.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/Gloock-OFL.txt +93 -0
- package/skills/canvas-design/canvas-fonts/Gloock-Regular.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/IBMPlexMono-Bold.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/IBMPlexMono-OFL.txt +93 -0
- package/skills/canvas-design/canvas-fonts/IBMPlexMono-Regular.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/IBMPlexSerif-Bold.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/IBMPlexSerif-BoldItalic.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/IBMPlexSerif-Italic.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/IBMPlexSerif-Regular.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/InstrumentSans-Bold.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/InstrumentSans-BoldItalic.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/InstrumentSans-Italic.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/InstrumentSans-OFL.txt +93 -0
- package/skills/canvas-design/canvas-fonts/InstrumentSans-Regular.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/InstrumentSerif-Italic.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/InstrumentSerif-Regular.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/Italiana-OFL.txt +93 -0
- package/skills/canvas-design/canvas-fonts/Italiana-Regular.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/JetBrainsMono-Bold.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/JetBrainsMono-OFL.txt +93 -0
- package/skills/canvas-design/canvas-fonts/JetBrainsMono-Regular.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/Jura-Light.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/Jura-Medium.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/Jura-OFL.txt +93 -0
- package/skills/canvas-design/canvas-fonts/LibreBaskerville-OFL.txt +93 -0
- package/skills/canvas-design/canvas-fonts/LibreBaskerville-Regular.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/Lora-Bold.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/Lora-BoldItalic.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/Lora-Italic.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/Lora-OFL.txt +93 -0
- package/skills/canvas-design/canvas-fonts/Lora-Regular.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/NationalPark-Bold.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/NationalPark-OFL.txt +93 -0
- package/skills/canvas-design/canvas-fonts/NationalPark-Regular.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/NothingYouCouldDo-OFL.txt +93 -0
- package/skills/canvas-design/canvas-fonts/NothingYouCouldDo-Regular.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/Outfit-Bold.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/Outfit-OFL.txt +93 -0
- package/skills/canvas-design/canvas-fonts/Outfit-Regular.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/PixelifySans-Medium.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/PixelifySans-OFL.txt +93 -0
- package/skills/canvas-design/canvas-fonts/PoiretOne-OFL.txt +93 -0
- package/skills/canvas-design/canvas-fonts/PoiretOne-Regular.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/RedHatMono-Bold.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/RedHatMono-OFL.txt +93 -0
- package/skills/canvas-design/canvas-fonts/RedHatMono-Regular.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/Silkscreen-OFL.txt +93 -0
- package/skills/canvas-design/canvas-fonts/Silkscreen-Regular.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/SmoochSans-Medium.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/SmoochSans-OFL.txt +93 -0
- package/skills/canvas-design/canvas-fonts/Tektur-Medium.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/Tektur-OFL.txt +93 -0
- package/skills/canvas-design/canvas-fonts/Tektur-Regular.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/WorkSans-Bold.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/WorkSans-BoldItalic.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/WorkSans-Italic.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/WorkSans-OFL.txt +93 -0
- package/skills/canvas-design/canvas-fonts/WorkSans-Regular.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/YoungSerif-OFL.txt +93 -0
- package/skills/canvas-design/canvas-fonts/YoungSerif-Regular.ttf +0 -0
- package/skills/changelog-generator/SKILL.md +110 -0
- package/skills/claude-api/LICENSE.txt +202 -0
- package/skills/claude-api/SKILL.md +546 -0
- package/skills/claude-api/csharp/claude-api/README.md +362 -0
- package/skills/claude-api/csharp/claude-api/batches.md +14 -0
- package/skills/claude-api/csharp/claude-api/files-api.md +23 -0
- package/skills/claude-api/csharp/claude-api/streaming.md +28 -0
- package/skills/claude-api/csharp/claude-api/tool-use.md +164 -0
- package/skills/claude-api/curl/examples.md +256 -0
- package/skills/claude-api/curl/managed-agents.md +340 -0
- package/skills/claude-api/go/claude-api/README.md +188 -0
- package/skills/claude-api/go/claude-api/files-api.md +21 -0
- package/skills/claude-api/go/claude-api/streaming.md +43 -0
- package/skills/claude-api/go/claude-api/tool-use.md +220 -0
- package/skills/claude-api/go/managed-agents/README.md +564 -0
- package/skills/claude-api/java/claude-api/README.md +238 -0
- package/skills/claude-api/java/claude-api/files-api.md +25 -0
- package/skills/claude-api/java/claude-api/streaming.md +24 -0
- package/skills/claude-api/java/claude-api/tool-use.md +228 -0
- package/skills/claude-api/java/managed-agents/README.md +443 -0
- package/skills/claude-api/php/claude-api/README.md +174 -0
- package/skills/claude-api/php/claude-api/batches.md +15 -0
- package/skills/claude-api/php/claude-api/files-api.md +11 -0
- package/skills/claude-api/php/claude-api/streaming.md +27 -0
- package/skills/claude-api/php/claude-api/tool-use.md +253 -0
- package/skills/claude-api/php/managed-agents/README.md +443 -0
- package/skills/claude-api/python/claude-api/README.md +565 -0
- package/skills/claude-api/python/claude-api/batches.md +198 -0
- package/skills/claude-api/python/claude-api/files-api.md +170 -0
- package/skills/claude-api/python/claude-api/streaming.md +179 -0
- package/skills/claude-api/python/claude-api/tool-use.md +629 -0
- package/skills/claude-api/python/managed-agents/README.md +335 -0
- package/skills/claude-api/ruby/claude-api/README.md +134 -0
- package/skills/claude-api/ruby/claude-api/streaming.md +16 -0
- package/skills/claude-api/ruby/claude-api/tool-use.md +41 -0
- package/skills/claude-api/ruby/managed-agents/README.md +394 -0
- package/skills/claude-api/shared/agent-design.md +101 -0
- package/skills/claude-api/shared/anthropic-cli.md +246 -0
- package/skills/claude-api/shared/claude-platform-on-aws.md +59 -0
- package/skills/claude-api/shared/error-codes.md +257 -0
- package/skills/claude-api/shared/live-sources.md +143 -0
- package/skills/claude-api/shared/managed-agents-api-reference.md +448 -0
- package/skills/claude-api/shared/managed-agents-client-patterns.md +217 -0
- package/skills/claude-api/shared/managed-agents-core.md +319 -0
- package/skills/claude-api/shared/managed-agents-environments.md +219 -0
- package/skills/claude-api/shared/managed-agents-events.md +270 -0
- package/skills/claude-api/shared/managed-agents-memory.md +199 -0
- package/skills/claude-api/shared/managed-agents-multiagent.md +125 -0
- package/skills/claude-api/shared/managed-agents-onboarding.md +82 -0
- package/skills/claude-api/shared/managed-agents-outcomes.md +108 -0
- package/skills/claude-api/shared/managed-agents-overview.md +71 -0
- package/skills/claude-api/shared/managed-agents-scheduled-deployments.md +146 -0
- package/skills/claude-api/shared/managed-agents-self-hosted-sandboxes.md +174 -0
- package/skills/claude-api/shared/managed-agents-tools.md +371 -0
- package/skills/claude-api/shared/managed-agents-webhooks.md +143 -0
- package/skills/claude-api/shared/model-migration.md +1548 -0
- package/skills/claude-api/shared/models.md +138 -0
- package/skills/claude-api/shared/platform-availability.md +97 -0
- package/skills/claude-api/shared/prompt-caching.md +235 -0
- package/skills/claude-api/shared/token-counting.md +56 -0
- package/skills/claude-api/shared/tool-use-concepts.md +514 -0
- package/skills/claude-api/typescript/claude-api/README.md +405 -0
- package/skills/claude-api/typescript/claude-api/batches.md +106 -0
- package/skills/claude-api/typescript/claude-api/files-api.md +98 -0
- package/skills/claude-api/typescript/claude-api/streaming.md +178 -0
- package/skills/claude-api/typescript/claude-api/tool-use.md +589 -0
- package/skills/claude-api/typescript/managed-agents/README.md +358 -0
- package/skills/code-security-auditor/SKILL.md +164 -0
- package/skills/code-security-auditor/references/package_checks.md +59 -0
- package/skills/competitive-ads-extractor/SKILL.md +298 -0
- package/skills/content-research-writer/SKILL.md +538 -0
- package/skills/developer-growth-analysis/SKILL.md +322 -0
- package/skills/dispatching-parallel-agents/SKILL.md +167 -0
- package/skills/doc-coauthoring/SKILL.md +375 -0
- package/skills/docx/LICENSE.txt +30 -0
- package/skills/docx/SKILL.md +91 -0
- package/skills/docx/scripts/__init__.py +1 -0
- package/skills/docx/scripts/accept_changes.py +135 -0
- package/skills/docx/scripts/comment.py +368 -0
- package/skills/docx/scripts/merge_runs.py +310 -0
- package/skills/docx/scripts/office/helpers/__init__.py +111 -0
- package/skills/docx/scripts/office/helpers/pptx_chart.py +170 -0
- package/skills/docx/scripts/office/helpers/pptx_slide.py +60 -0
- package/skills/docx/scripts/office/helpers/pptx_theme.py +114 -0
- package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +1499 -0
- package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +146 -0
- package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +1085 -0
- package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +11 -0
- package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-main.xsd +3081 -0
- package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +23 -0
- package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +185 -0
- package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +287 -0
- package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/pml.xsd +1676 -0
- package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +28 -0
- package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +144 -0
- package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +174 -0
- package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +25 -0
- package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +18 -0
- package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +59 -0
- package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +56 -0
- package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +195 -0
- package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-math.xsd +582 -0
- package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +25 -0
- package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/sml.xsd +4439 -0
- package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-main.xsd +570 -0
- package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +509 -0
- package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +12 -0
- package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +108 -0
- package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +96 -0
- package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/wml.xsd +3646 -0
- package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/xml.xsd +116 -0
- package/skills/docx/scripts/office/schemas/ecma/fouth-edition/opc-contentTypes.xsd +42 -0
- package/skills/docx/scripts/office/schemas/ecma/fouth-edition/opc-coreProperties.xsd +50 -0
- package/skills/docx/scripts/office/schemas/ecma/fouth-edition/opc-digSig.xsd +49 -0
- package/skills/docx/scripts/office/schemas/ecma/fouth-edition/opc-relationships.xsd +33 -0
- package/skills/docx/scripts/office/schemas/mce/mc.xsd +75 -0
- package/skills/docx/scripts/office/schemas/microsoft/wml-2010.xsd +560 -0
- package/skills/docx/scripts/office/schemas/microsoft/wml-2012.xsd +67 -0
- package/skills/docx/scripts/office/schemas/microsoft/wml-2018.xsd +14 -0
- package/skills/docx/scripts/office/schemas/microsoft/wml-cex-2018.xsd +20 -0
- package/skills/docx/scripts/office/schemas/microsoft/wml-cid-2016.xsd +13 -0
- package/skills/docx/scripts/office/schemas/microsoft/wml-sdtdatahash-2020.xsd +4 -0
- package/skills/docx/scripts/office/schemas/microsoft/wml-symex-2015.xsd +8 -0
- package/skills/docx/scripts/office/soffice.py +192 -0
- package/skills/docx/scripts/office/validate.py +173 -0
- package/skills/docx/scripts/office/validators/__init__.py +15 -0
- package/skills/docx/scripts/office/validators/base.py +875 -0
- package/skills/docx/scripts/office/validators/docx.py +466 -0
- package/skills/docx/scripts/office/validators/pptx.py +441 -0
- package/skills/docx/scripts/office/validators/redlining.py +299 -0
- package/skills/docx/scripts/templates/comments.xml +3 -0
- package/skills/docx/scripts/templates/commentsExtended.xml +3 -0
- package/skills/docx/scripts/templates/commentsExtensible.xml +3 -0
- package/skills/docx/scripts/templates/commentsIds.xml +3 -0
- package/skills/docx/scripts/templates/people.xml +3 -0
- package/skills/domain-name-brainstormer/SKILL.md +217 -0
- package/skills/executing-plans/SKILL.md +64 -0
- package/skills/file-organizer/SKILL.md +433 -0
- package/skills/finishing-a-development-branch/SKILL.md +201 -0
- package/skills/frontend-design/LICENSE.txt +177 -0
- package/skills/frontend-design/SKILL.md +55 -0
- package/skills/image-enhancer/SKILL.md +106 -0
- package/skills/internal-comms/LICENSE.txt +202 -0
- package/skills/internal-comms/SKILL.md +32 -0
- package/skills/internal-comms/examples/3p-updates.md +47 -0
- package/skills/internal-comms/examples/company-newsletter.md +65 -0
- package/skills/internal-comms/examples/faq-answers.md +30 -0
- package/skills/internal-comms/examples/general-comms.md +16 -0
- package/skills/invoice-organizer/SKILL.md +452 -0
- package/skills/lead-research-assistant/SKILL.md +205 -0
- package/skills/mcp-builder/LICENSE.txt +202 -0
- package/skills/mcp-builder/SKILL.md +236 -0
- package/skills/mcp-builder/reference/evaluation.md +602 -0
- package/skills/mcp-builder/reference/mcp_best_practices.md +249 -0
- package/skills/mcp-builder/reference/node_mcp_server.md +970 -0
- package/skills/mcp-builder/reference/python_mcp_server.md +719 -0
- package/skills/mcp-builder/scripts/connections.py +151 -0
- package/skills/mcp-builder/scripts/evaluation.py +373 -0
- package/skills/mcp-builder/scripts/example_evaluation.xml +22 -0
- package/skills/mcp-builder/scripts/requirements.txt +2 -0
- package/skills/meeting-insights-analyzer/SKILL.md +327 -0
- package/skills/pdf/LICENSE.txt +30 -0
- package/skills/pdf/SKILL.md +314 -0
- package/skills/pdf/forms.md +294 -0
- package/skills/pdf/reference.md +612 -0
- package/skills/pdf/scripts/check_bounding_boxes.py +65 -0
- package/skills/pdf/scripts/check_fillable_fields.py +11 -0
- package/skills/pdf/scripts/convert_pdf_to_images.py +33 -0
- package/skills/pdf/scripts/create_validation_image.py +37 -0
- package/skills/pdf/scripts/extract_form_field_info.py +122 -0
- package/skills/pdf/scripts/extract_form_structure.py +115 -0
- package/skills/pdf/scripts/fill_fillable_fields.py +98 -0
- package/skills/pdf/scripts/fill_pdf_form_with_annotations.py +107 -0
- package/skills/pptx/LICENSE.txt +30 -0
- package/skills/pptx/SKILL.md +238 -0
- package/skills/pptx/scripts/__init__.py +0 -0
- package/skills/pptx/scripts/add_slide.py +367 -0
- package/skills/pptx/scripts/clean.py +309 -0
- package/skills/pptx/scripts/office/helpers/__init__.py +111 -0
- package/skills/pptx/scripts/office/helpers/pptx_chart.py +170 -0
- package/skills/pptx/scripts/office/helpers/pptx_slide.py +60 -0
- package/skills/pptx/scripts/office/helpers/pptx_theme.py +114 -0
- package/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +1499 -0
- package/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +146 -0
- package/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +1085 -0
- package/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +11 -0
- package/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-main.xsd +3081 -0
- package/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +23 -0
- package/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +185 -0
- package/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +287 -0
- package/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/pml.xsd +1676 -0
- package/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +28 -0
- package/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +144 -0
- package/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +174 -0
- package/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +25 -0
- package/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +18 -0
- package/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +59 -0
- package/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +56 -0
- package/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +195 -0
- package/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-math.xsd +582 -0
- package/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +25 -0
- package/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/sml.xsd +4439 -0
- package/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-main.xsd +570 -0
- package/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +509 -0
- package/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +12 -0
- package/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +108 -0
- package/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +96 -0
- package/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/wml.xsd +3646 -0
- package/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/xml.xsd +116 -0
- package/skills/pptx/scripts/office/schemas/ecma/fouth-edition/opc-contentTypes.xsd +42 -0
- package/skills/pptx/scripts/office/schemas/ecma/fouth-edition/opc-coreProperties.xsd +50 -0
- package/skills/pptx/scripts/office/schemas/ecma/fouth-edition/opc-digSig.xsd +49 -0
- package/skills/pptx/scripts/office/schemas/ecma/fouth-edition/opc-relationships.xsd +33 -0
- package/skills/pptx/scripts/office/schemas/mce/mc.xsd +75 -0
- package/skills/pptx/scripts/office/schemas/microsoft/wml-2010.xsd +560 -0
- package/skills/pptx/scripts/office/schemas/microsoft/wml-2012.xsd +67 -0
- package/skills/pptx/scripts/office/schemas/microsoft/wml-2018.xsd +14 -0
- package/skills/pptx/scripts/office/schemas/microsoft/wml-cex-2018.xsd +20 -0
- package/skills/pptx/scripts/office/schemas/microsoft/wml-cid-2016.xsd +13 -0
- package/skills/pptx/scripts/office/schemas/microsoft/wml-sdtdatahash-2020.xsd +4 -0
- package/skills/pptx/scripts/office/schemas/microsoft/wml-symex-2015.xsd +8 -0
- package/skills/pptx/scripts/office/soffice.py +192 -0
- package/skills/pptx/scripts/office/validate.py +173 -0
- package/skills/pptx/scripts/office/validators/__init__.py +15 -0
- package/skills/pptx/scripts/office/validators/base.py +875 -0
- package/skills/pptx/scripts/office/validators/docx.py +466 -0
- package/skills/pptx/scripts/office/validators/pptx.py +441 -0
- package/skills/pptx/scripts/office/validators/redlining.py +299 -0
- package/skills/pptx/scripts/thumbnail.py +311 -0
- package/skills/raffle-winner-picker/SKILL.md +165 -0
- package/skills/receiving-code-review/SKILL.md +205 -0
- package/skills/requesting-code-review/SKILL.md +95 -0
- package/skills/requesting-code-review/code-reviewer.md +172 -0
- package/skills/skill-creator/LICENSE.txt +202 -0
- package/skills/skill-creator/SKILL.md +485 -0
- package/skills/skill-creator/agents/analyzer.md +274 -0
- package/skills/skill-creator/agents/comparator.md +202 -0
- package/skills/skill-creator/agents/grader.md +223 -0
- package/skills/skill-creator/assets/eval_review.html +146 -0
- package/skills/skill-creator/eval-viewer/generate_review.py +471 -0
- package/skills/skill-creator/eval-viewer/viewer.html +1325 -0
- package/skills/skill-creator/references/schemas.md +430 -0
- package/skills/skill-creator/scripts/__init__.py +0 -0
- package/skills/skill-creator/scripts/aggregate_benchmark.py +401 -0
- package/skills/skill-creator/scripts/generate_report.py +326 -0
- package/skills/skill-creator/scripts/improve_description.py +247 -0
- package/skills/skill-creator/scripts/package_skill.py +136 -0
- package/skills/skill-creator/scripts/quick_validate.py +103 -0
- package/skills/skill-creator/scripts/run_eval.py +310 -0
- package/skills/skill-creator/scripts/run_loop.py +328 -0
- package/skills/skill-creator/scripts/utils.py +47 -0
- package/skills/skill-share/SKILL.md +80 -0
- package/skills/slack-gif-creator/LICENSE.txt +202 -0
- package/skills/slack-gif-creator/SKILL.md +254 -0
- package/skills/slack-gif-creator/core/easing.py +234 -0
- package/skills/slack-gif-creator/core/frame_composer.py +176 -0
- package/skills/slack-gif-creator/core/gif_builder.py +269 -0
- package/skills/slack-gif-creator/core/validators.py +136 -0
- package/skills/slack-gif-creator/requirements.txt +4 -0
- package/skills/staff-engineer-review/SKILL.md +172 -0
- package/skills/subagent-driven-development/SKILL.md +503 -0
- package/skills/subagent-driven-development/implementer-prompt.md +142 -0
- package/skills/subagent-driven-development/re-review-prompt.md +106 -0
- package/skills/subagent-driven-development/scripts/review-package +46 -0
- package/skills/subagent-driven-development/scripts/sdd-workspace +40 -0
- package/skills/subagent-driven-development/scripts/task-brief +41 -0
- package/skills/subagent-driven-development/task-reviewer-prompt.md +185 -0
- package/skills/systematic-debugging/CREATION-LOG.md +119 -0
- package/skills/systematic-debugging/SKILL.md +283 -0
- package/skills/systematic-debugging/condition-based-waiting-example.ts +158 -0
- package/skills/systematic-debugging/condition-based-waiting.md +115 -0
- package/skills/systematic-debugging/defense-in-depth.md +122 -0
- package/skills/systematic-debugging/find-polluter.sh +72 -0
- package/skills/systematic-debugging/root-cause-tracing.md +169 -0
- package/skills/systematic-debugging/test-academic.md +14 -0
- package/skills/systematic-debugging/test-pressure-1.md +58 -0
- package/skills/systematic-debugging/test-pressure-2.md +68 -0
- package/skills/systematic-debugging/test-pressure-3.md +69 -0
- package/skills/test-driven-development/SKILL.md +320 -0
- package/skills/test-driven-development/writing-good-tests.md +198 -0
- package/skills/theme-factory/LICENSE.txt +202 -0
- package/skills/theme-factory/SKILL.md +59 -0
- package/skills/theme-factory/theme-showcase.pdf +0 -0
- package/skills/theme-factory/themes/arctic-frost.md +19 -0
- package/skills/theme-factory/themes/botanical-garden.md +19 -0
- package/skills/theme-factory/themes/desert-rose.md +19 -0
- package/skills/theme-factory/themes/forest-canopy.md +19 -0
- package/skills/theme-factory/themes/golden-hour.md +19 -0
- package/skills/theme-factory/themes/midnight-galaxy.md +19 -0
- package/skills/theme-factory/themes/modern-minimalist.md +19 -0
- package/skills/theme-factory/themes/ocean-depths.md +19 -0
- package/skills/theme-factory/themes/sunset-boulevard.md +19 -0
- package/skills/theme-factory/themes/tech-innovation.md +19 -0
- package/skills/using-git-worktrees/SKILL.md +167 -0
- package/skills/using-superpowers/SKILL.md +62 -0
- package/skills/using-superpowers/references/antigravity-tools.md +23 -0
- package/skills/using-superpowers/references/codex-tools.md +39 -0
- package/skills/using-superpowers/references/gemini-tools.md +63 -0
- package/skills/using-superpowers/references/pi-tools.md +16 -0
- package/skills/verification-before-completion/SKILL.md +120 -0
- package/skills/video-downloader/SKILL.md +112 -0
- package/skills/web-artifacts-builder/LICENSE.txt +202 -0
- package/skills/web-artifacts-builder/SKILL.md +74 -0
- package/skills/web-artifacts-builder/scripts/bundle-artifact.sh +54 -0
- package/skills/web-artifacts-builder/scripts/init-artifact.sh +322 -0
- package/skills/web-artifacts-builder/scripts/shadcn-components.tar.gz +0 -0
- package/skills/webapp-testing/LICENSE.txt +202 -0
- package/skills/webapp-testing/SKILL.md +96 -0
- package/skills/webapp-testing/examples/console_logging.py +35 -0
- package/skills/webapp-testing/examples/element_discovery.py +40 -0
- package/skills/webapp-testing/examples/static_html_automation.py +33 -0
- package/skills/webapp-testing/scripts/with_server.py +106 -0
- package/skills/writing-plans/SKILL.md +168 -0
- package/skills/writing-plans/plan-document-reviewer-prompt.md +49 -0
- package/skills/writing-skills/SKILL.md +679 -0
- package/skills/writing-skills/anthropic-best-practices.md +1150 -0
- package/skills/writing-skills/examples/CLAUDE_MD_TESTING.md +189 -0
- package/skills/writing-skills/graphviz-conventions.dot +172 -0
- package/skills/writing-skills/persuasion-principles.md +187 -0
- package/skills/writing-skills/render-graphs.js +168 -0
- package/skills/writing-skills/testing-skills-with-subagents.md +384 -0
- package/skills/xlsx/LICENSE.txt +30 -0
- package/skills/xlsx/SKILL.md +99 -0
- package/skills/xlsx/scripts/office/helpers/__init__.py +111 -0
- package/skills/xlsx/scripts/office/helpers/pptx_chart.py +170 -0
- package/skills/xlsx/scripts/office/helpers/pptx_slide.py +60 -0
- package/skills/xlsx/scripts/office/helpers/pptx_theme.py +114 -0
- package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +1499 -0
- package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +146 -0
- package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +1085 -0
- package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +11 -0
- package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-main.xsd +3081 -0
- package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +23 -0
- package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +185 -0
- package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +287 -0
- package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/pml.xsd +1676 -0
- package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +28 -0
- package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +144 -0
- package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +174 -0
- package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +25 -0
- package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +18 -0
- package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +59 -0
- package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +56 -0
- package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +195 -0
- package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-math.xsd +582 -0
- package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +25 -0
- package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/sml.xsd +4439 -0
- package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-main.xsd +570 -0
- package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +509 -0
- package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +12 -0
- package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +108 -0
- package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +96 -0
- package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/wml.xsd +3646 -0
- package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/xml.xsd +116 -0
- package/skills/xlsx/scripts/office/schemas/ecma/fouth-edition/opc-contentTypes.xsd +42 -0
- package/skills/xlsx/scripts/office/schemas/ecma/fouth-edition/opc-coreProperties.xsd +50 -0
- package/skills/xlsx/scripts/office/schemas/ecma/fouth-edition/opc-digSig.xsd +49 -0
- package/skills/xlsx/scripts/office/schemas/ecma/fouth-edition/opc-relationships.xsd +33 -0
- package/skills/xlsx/scripts/office/schemas/mce/mc.xsd +75 -0
- package/skills/xlsx/scripts/office/schemas/microsoft/wml-2010.xsd +560 -0
- package/skills/xlsx/scripts/office/schemas/microsoft/wml-2012.xsd +67 -0
- package/skills/xlsx/scripts/office/schemas/microsoft/wml-2018.xsd +14 -0
- package/skills/xlsx/scripts/office/schemas/microsoft/wml-cex-2018.xsd +20 -0
- package/skills/xlsx/scripts/office/schemas/microsoft/wml-cid-2016.xsd +13 -0
- package/skills/xlsx/scripts/office/schemas/microsoft/wml-sdtdatahash-2020.xsd +4 -0
- package/skills/xlsx/scripts/office/schemas/microsoft/wml-symex-2015.xsd +8 -0
- package/skills/xlsx/scripts/office/soffice.py +192 -0
- package/skills/xlsx/scripts/office/validate.py +173 -0
- package/skills/xlsx/scripts/office/validators/__init__.py +15 -0
- package/skills/xlsx/scripts/office/validators/base.py +875 -0
- package/skills/xlsx/scripts/office/validators/docx.py +466 -0
- package/skills/xlsx/scripts/office/validators/pptx.py +441 -0
- package/skills/xlsx/scripts/office/validators/redlining.py +299 -0
- package/skills/xlsx/scripts/recalc.py +308 -0
- package/src/account/account.ts +1 -2
- package/src/account/repo.ts +2 -1
- package/src/acp/content.ts +1 -1
- package/src/acp/directory.ts +2 -2
- package/src/acp/event.ts +1 -1
- package/src/acp/session.ts +2 -2
- package/src/agent/agent.ts +62 -31
- package/src/agent/subagent-permissions.ts +1 -1
- package/src/cli/cmd/account.ts +2 -1
- package/src/cli/cmd/debug/agent.handler.ts +1 -1
- package/src/cli/cmd/export.ts +1 -1
- package/src/cli/cmd/github.handler.ts +4 -2
- package/src/cli/cmd/mcp.ts +2 -2
- package/src/cli/cmd/run/footer.prompt.tsx +7 -2
- package/src/cli/cmd/stats.ts +1 -1
- package/src/cli/network.ts +1 -1
- package/src/config/config.ts +3 -5
- package/src/config/plugin.ts +1 -1
- package/src/control-plane/workspace.ts +3 -2
- package/src/effect/app-node-builder-v1.ts +1 -1
- package/src/effect/instance-state.ts +2 -1
- package/src/effect/runner.ts +2 -1
- package/src/effect/runtime-flags.ts +2 -1
- package/src/image/image.ts +1 -1
- package/src/installation/index.ts +4 -8
- package/src/lsp/diagnostic.ts +1 -1
- package/src/mcp/catalog.ts +1 -1
- package/src/mcp/index.ts +2 -2
- package/src/mcp/oauth-provider.ts +1 -1
- package/src/permission/index.ts +7 -3
- package/src/plugin/index.ts +7 -3
- package/src/plugin/loader.ts +1 -1
- package/src/plugin/tui/runtime.ts +1 -1
- package/src/project/bootstrap-service.ts +2 -1
- package/src/project/project.ts +3 -2
- package/src/project/vcs.ts +1 -1
- package/src/provider/error.ts +1 -1
- package/src/provider/provider.ts +3 -2
- package/src/question/index.ts +1 -1
- package/src/server/auth.ts +2 -1
- package/src/server/routes/instance/httpapi/groups/metadata.ts +1 -1
- package/src/server/routes/instance/httpapi/handlers/control-plane.ts +2 -1
- package/src/server/routes/instance/httpapi/handlers/control.ts +2 -2
- package/src/server/routes/instance/httpapi/handlers/experimental.ts +2 -1
- package/src/server/routes/instance/httpapi/handlers/global.ts +2 -1
- package/src/server/routes/instance/httpapi/handlers/mcp.ts +2 -1
- package/src/server/routes/instance/httpapi/handlers/permission.ts +1 -1
- package/src/server/routes/instance/httpapi/handlers/project-copy.ts +1 -1
- package/src/server/routes/instance/httpapi/handlers/provider.ts +3 -2
- package/src/server/routes/instance/httpapi/handlers/pty.ts +1 -1
- package/src/server/routes/instance/httpapi/handlers/question.ts +1 -1
- package/src/server/routes/instance/httpapi/handlers/session.ts +5 -5
- package/src/server/routes/instance/httpapi/handlers/sync.ts +2 -2
- package/src/server/routes/instance/httpapi/handlers/tui.ts +1 -1
- package/src/server/routes/instance/httpapi/handlers/workspace.ts +2 -1
- package/src/server/routes/instance/httpapi/lifecycle.ts +2 -1
- package/src/server/routes/instance/httpapi/middleware/instance-context.ts +1 -1
- package/src/server/routes/instance/httpapi/middleware/proxy.ts +2 -1
- package/src/server/routes/instance/httpapi/server.ts +2 -1
- package/src/server/shared/fence.ts +1 -1
- package/src/server/shared/ui.ts +2 -1
- package/src/session/compaction.ts +5 -4
- package/src/session/instruction.ts +1 -1
- package/src/session/llm/native-runtime.ts +2 -1
- package/src/session/llm/request.ts +2 -2
- package/src/session/llm.ts +2 -2
- package/src/session/message-v2.ts +5 -16
- package/src/session/overflow.ts +2 -2
- package/src/session/prompt.ts +4 -3
- package/src/session/reminders.ts +2 -2
- package/src/session/revert.ts +1 -1
- package/src/session/run-state.ts +4 -3
- package/src/session/session.ts +2 -1
- package/src/session/status.ts +1 -1
- package/src/session/summary.ts +1 -1
- package/src/session/system.ts +1 -1
- package/src/session/todo.ts +1 -1
- package/src/session/tools.ts +6 -6
- package/src/share/session.ts +1 -1
- package/src/share/share-next.ts +1 -1
- package/src/tool/computer.ts +195 -136
- package/src/tool/edit.ts +1 -1
- package/src/tool/mcp-websearch.ts +2 -1
- package/src/tool/plan.ts +1 -1
- package/src/tool/registry.ts +2 -2
- package/src/tool/task.ts +1 -1
- package/src/tool/tool.ts +2 -2
- package/src/util/bom.ts +1 -1
|
@@ -0,0 +1,269 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
GIF Builder - Core module for assembling frames into GIFs optimized for Slack.
|
|
4
|
+
|
|
5
|
+
This module provides the main interface for creating GIFs from programmatically
|
|
6
|
+
generated frames, with automatic optimization for Slack's requirements.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from pathlib import Path
|
|
10
|
+
from typing import Optional
|
|
11
|
+
|
|
12
|
+
import imageio.v3 as imageio
|
|
13
|
+
import numpy as np
|
|
14
|
+
from PIL import Image
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
class GIFBuilder:
|
|
18
|
+
"""Builder for creating optimized GIFs from frames."""
|
|
19
|
+
|
|
20
|
+
def __init__(self, width: int = 480, height: int = 480, fps: int = 15):
|
|
21
|
+
"""
|
|
22
|
+
Initialize GIF builder.
|
|
23
|
+
|
|
24
|
+
Args:
|
|
25
|
+
width: Frame width in pixels
|
|
26
|
+
height: Frame height in pixels
|
|
27
|
+
fps: Frames per second
|
|
28
|
+
"""
|
|
29
|
+
self.width = width
|
|
30
|
+
self.height = height
|
|
31
|
+
self.fps = fps
|
|
32
|
+
self.frames: list[np.ndarray] = []
|
|
33
|
+
|
|
34
|
+
def add_frame(self, frame: np.ndarray | Image.Image):
|
|
35
|
+
"""
|
|
36
|
+
Add a frame to the GIF.
|
|
37
|
+
|
|
38
|
+
Args:
|
|
39
|
+
frame: Frame as numpy array or PIL Image (will be converted to RGB)
|
|
40
|
+
"""
|
|
41
|
+
if isinstance(frame, Image.Image):
|
|
42
|
+
frame = np.array(frame.convert("RGB"))
|
|
43
|
+
|
|
44
|
+
# Ensure frame is correct size
|
|
45
|
+
if frame.shape[:2] != (self.height, self.width):
|
|
46
|
+
pil_frame = Image.fromarray(frame)
|
|
47
|
+
pil_frame = pil_frame.resize(
|
|
48
|
+
(self.width, self.height), Image.Resampling.LANCZOS
|
|
49
|
+
)
|
|
50
|
+
frame = np.array(pil_frame)
|
|
51
|
+
|
|
52
|
+
self.frames.append(frame)
|
|
53
|
+
|
|
54
|
+
def add_frames(self, frames: list[np.ndarray | Image.Image]):
|
|
55
|
+
"""Add multiple frames at once."""
|
|
56
|
+
for frame in frames:
|
|
57
|
+
self.add_frame(frame)
|
|
58
|
+
|
|
59
|
+
def optimize_colors(
|
|
60
|
+
self, num_colors: int = 128, use_global_palette: bool = True
|
|
61
|
+
) -> list[np.ndarray]:
|
|
62
|
+
"""
|
|
63
|
+
Reduce colors in all frames using quantization.
|
|
64
|
+
|
|
65
|
+
Args:
|
|
66
|
+
num_colors: Target number of colors (8-256)
|
|
67
|
+
use_global_palette: Use a single palette for all frames (better compression)
|
|
68
|
+
|
|
69
|
+
Returns:
|
|
70
|
+
List of color-optimized frames
|
|
71
|
+
"""
|
|
72
|
+
optimized = []
|
|
73
|
+
|
|
74
|
+
if use_global_palette and len(self.frames) > 1:
|
|
75
|
+
# Create a global palette from all frames
|
|
76
|
+
# Sample frames to build palette
|
|
77
|
+
sample_size = min(5, len(self.frames))
|
|
78
|
+
sample_indices = [
|
|
79
|
+
int(i * len(self.frames) / sample_size) for i in range(sample_size)
|
|
80
|
+
]
|
|
81
|
+
sample_frames = [self.frames[i] for i in sample_indices]
|
|
82
|
+
|
|
83
|
+
# Combine sample frames into a single image for palette generation
|
|
84
|
+
# Flatten each frame to get all pixels, then stack them
|
|
85
|
+
all_pixels = np.vstack(
|
|
86
|
+
[f.reshape(-1, 3) for f in sample_frames]
|
|
87
|
+
) # (total_pixels, 3)
|
|
88
|
+
|
|
89
|
+
# Create a properly-shaped RGB image from the pixel data
|
|
90
|
+
# We'll make a roughly square image from all the pixels
|
|
91
|
+
total_pixels = len(all_pixels)
|
|
92
|
+
width = min(512, int(np.sqrt(total_pixels))) # Reasonable width, max 512
|
|
93
|
+
height = (total_pixels + width - 1) // width # Ceiling division
|
|
94
|
+
|
|
95
|
+
# Pad if necessary to fill the rectangle
|
|
96
|
+
pixels_needed = width * height
|
|
97
|
+
if pixels_needed > total_pixels:
|
|
98
|
+
padding = np.zeros((pixels_needed - total_pixels, 3), dtype=np.uint8)
|
|
99
|
+
all_pixels = np.vstack([all_pixels, padding])
|
|
100
|
+
|
|
101
|
+
# Reshape to proper RGB image format (H, W, 3)
|
|
102
|
+
img_array = (
|
|
103
|
+
all_pixels[:pixels_needed].reshape(height, width, 3).astype(np.uint8)
|
|
104
|
+
)
|
|
105
|
+
combined_img = Image.fromarray(img_array, mode="RGB")
|
|
106
|
+
|
|
107
|
+
# Generate global palette
|
|
108
|
+
global_palette = combined_img.quantize(colors=num_colors, method=2)
|
|
109
|
+
|
|
110
|
+
# Apply global palette to all frames
|
|
111
|
+
for frame in self.frames:
|
|
112
|
+
pil_frame = Image.fromarray(frame)
|
|
113
|
+
quantized = pil_frame.quantize(palette=global_palette, dither=1)
|
|
114
|
+
optimized.append(np.array(quantized.convert("RGB")))
|
|
115
|
+
else:
|
|
116
|
+
# Use per-frame quantization
|
|
117
|
+
for frame in self.frames:
|
|
118
|
+
pil_frame = Image.fromarray(frame)
|
|
119
|
+
quantized = pil_frame.quantize(colors=num_colors, method=2, dither=1)
|
|
120
|
+
optimized.append(np.array(quantized.convert("RGB")))
|
|
121
|
+
|
|
122
|
+
return optimized
|
|
123
|
+
|
|
124
|
+
def deduplicate_frames(self, threshold: float = 0.9995) -> int:
|
|
125
|
+
"""
|
|
126
|
+
Remove duplicate or near-duplicate consecutive frames.
|
|
127
|
+
|
|
128
|
+
Args:
|
|
129
|
+
threshold: Similarity threshold (0.0-1.0). Higher = more strict (0.9995 = nearly identical).
|
|
130
|
+
Use 0.9995+ to preserve subtle animations, 0.98 for aggressive removal.
|
|
131
|
+
|
|
132
|
+
Returns:
|
|
133
|
+
Number of frames removed
|
|
134
|
+
"""
|
|
135
|
+
if len(self.frames) < 2:
|
|
136
|
+
return 0
|
|
137
|
+
|
|
138
|
+
deduplicated = [self.frames[0]]
|
|
139
|
+
removed_count = 0
|
|
140
|
+
|
|
141
|
+
for i in range(1, len(self.frames)):
|
|
142
|
+
# Compare with previous frame
|
|
143
|
+
prev_frame = np.array(deduplicated[-1], dtype=np.float32)
|
|
144
|
+
curr_frame = np.array(self.frames[i], dtype=np.float32)
|
|
145
|
+
|
|
146
|
+
# Calculate similarity (normalized)
|
|
147
|
+
diff = np.abs(prev_frame - curr_frame)
|
|
148
|
+
similarity = 1.0 - (np.mean(diff) / 255.0)
|
|
149
|
+
|
|
150
|
+
# Keep frame if sufficiently different
|
|
151
|
+
# High threshold (0.9995+) means only remove nearly identical frames
|
|
152
|
+
if similarity < threshold:
|
|
153
|
+
deduplicated.append(self.frames[i])
|
|
154
|
+
else:
|
|
155
|
+
removed_count += 1
|
|
156
|
+
|
|
157
|
+
self.frames = deduplicated
|
|
158
|
+
return removed_count
|
|
159
|
+
|
|
160
|
+
def save(
|
|
161
|
+
self,
|
|
162
|
+
output_path: str | Path,
|
|
163
|
+
num_colors: int = 128,
|
|
164
|
+
optimize_for_emoji: bool = False,
|
|
165
|
+
remove_duplicates: bool = False,
|
|
166
|
+
) -> dict:
|
|
167
|
+
"""
|
|
168
|
+
Save frames as optimized GIF for Slack.
|
|
169
|
+
|
|
170
|
+
Args:
|
|
171
|
+
output_path: Where to save the GIF
|
|
172
|
+
num_colors: Number of colors to use (fewer = smaller file)
|
|
173
|
+
optimize_for_emoji: If True, optimize for emoji size (128x128, fewer colors)
|
|
174
|
+
remove_duplicates: If True, remove duplicate consecutive frames (opt-in)
|
|
175
|
+
|
|
176
|
+
Returns:
|
|
177
|
+
Dictionary with file info (path, size, dimensions, frame_count)
|
|
178
|
+
"""
|
|
179
|
+
if not self.frames:
|
|
180
|
+
raise ValueError("No frames to save. Add frames with add_frame() first.")
|
|
181
|
+
|
|
182
|
+
output_path = Path(output_path)
|
|
183
|
+
|
|
184
|
+
# Remove duplicate frames to reduce file size
|
|
185
|
+
if remove_duplicates:
|
|
186
|
+
removed = self.deduplicate_frames(threshold=0.9995)
|
|
187
|
+
if removed > 0:
|
|
188
|
+
print(
|
|
189
|
+
f" Removed {removed} nearly identical frames (preserved subtle animations)"
|
|
190
|
+
)
|
|
191
|
+
|
|
192
|
+
# Optimize for emoji if requested
|
|
193
|
+
if optimize_for_emoji:
|
|
194
|
+
if self.width > 128 or self.height > 128:
|
|
195
|
+
print(
|
|
196
|
+
f" Resizing from {self.width}x{self.height} to 128x128 for emoji"
|
|
197
|
+
)
|
|
198
|
+
self.width = 128
|
|
199
|
+
self.height = 128
|
|
200
|
+
# Resize all frames
|
|
201
|
+
resized_frames = []
|
|
202
|
+
for frame in self.frames:
|
|
203
|
+
pil_frame = Image.fromarray(frame)
|
|
204
|
+
pil_frame = pil_frame.resize((128, 128), Image.Resampling.LANCZOS)
|
|
205
|
+
resized_frames.append(np.array(pil_frame))
|
|
206
|
+
self.frames = resized_frames
|
|
207
|
+
num_colors = min(num_colors, 48) # More aggressive color limit for emoji
|
|
208
|
+
|
|
209
|
+
# More aggressive FPS reduction for emoji
|
|
210
|
+
if len(self.frames) > 12:
|
|
211
|
+
print(
|
|
212
|
+
f" Reducing frames from {len(self.frames)} to ~12 for emoji size"
|
|
213
|
+
)
|
|
214
|
+
# Keep every nth frame to get close to 12 frames
|
|
215
|
+
keep_every = max(1, len(self.frames) // 12)
|
|
216
|
+
self.frames = [
|
|
217
|
+
self.frames[i] for i in range(0, len(self.frames), keep_every)
|
|
218
|
+
]
|
|
219
|
+
|
|
220
|
+
# Optimize colors with global palette
|
|
221
|
+
optimized_frames = self.optimize_colors(num_colors, use_global_palette=True)
|
|
222
|
+
|
|
223
|
+
# Calculate frame duration in milliseconds
|
|
224
|
+
frame_duration = 1000 / self.fps
|
|
225
|
+
|
|
226
|
+
# Save GIF
|
|
227
|
+
imageio.imwrite(
|
|
228
|
+
output_path,
|
|
229
|
+
optimized_frames,
|
|
230
|
+
duration=frame_duration,
|
|
231
|
+
loop=0, # Infinite loop
|
|
232
|
+
)
|
|
233
|
+
|
|
234
|
+
# Get file info
|
|
235
|
+
file_size_kb = output_path.stat().st_size / 1024
|
|
236
|
+
file_size_mb = file_size_kb / 1024
|
|
237
|
+
|
|
238
|
+
info = {
|
|
239
|
+
"path": str(output_path),
|
|
240
|
+
"size_kb": file_size_kb,
|
|
241
|
+
"size_mb": file_size_mb,
|
|
242
|
+
"dimensions": f"{self.width}x{self.height}",
|
|
243
|
+
"frame_count": len(optimized_frames),
|
|
244
|
+
"fps": self.fps,
|
|
245
|
+
"duration_seconds": len(optimized_frames) / self.fps,
|
|
246
|
+
"colors": num_colors,
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
# Print info
|
|
250
|
+
print(f"\n✓ GIF created successfully!")
|
|
251
|
+
print(f" Path: {output_path}")
|
|
252
|
+
print(f" Size: {file_size_kb:.1f} KB ({file_size_mb:.2f} MB)")
|
|
253
|
+
print(f" Dimensions: {self.width}x{self.height}")
|
|
254
|
+
print(f" Frames: {len(optimized_frames)} @ {self.fps} fps")
|
|
255
|
+
print(f" Duration: {info['duration_seconds']:.1f}s")
|
|
256
|
+
print(f" Colors: {num_colors}")
|
|
257
|
+
|
|
258
|
+
# Size info
|
|
259
|
+
if optimize_for_emoji:
|
|
260
|
+
print(f" Optimized for emoji (128x128, reduced colors)")
|
|
261
|
+
if file_size_mb > 1.0:
|
|
262
|
+
print(f"\n Note: Large file size ({file_size_kb:.1f} KB)")
|
|
263
|
+
print(" Consider: fewer frames, smaller dimensions, or fewer colors")
|
|
264
|
+
|
|
265
|
+
return info
|
|
266
|
+
|
|
267
|
+
def clear(self):
|
|
268
|
+
"""Clear all frames (useful for creating multiple GIFs)."""
|
|
269
|
+
self.frames = []
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
Validators - Check if GIFs meet Slack's requirements.
|
|
4
|
+
|
|
5
|
+
These validators help ensure your GIFs meet Slack's size and dimension constraints.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from pathlib import Path
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
def validate_gif(
|
|
12
|
+
gif_path: str | Path, is_emoji: bool = True, verbose: bool = True
|
|
13
|
+
) -> tuple[bool, dict]:
|
|
14
|
+
"""
|
|
15
|
+
Validate GIF for Slack (dimensions, size, frame count).
|
|
16
|
+
|
|
17
|
+
Args:
|
|
18
|
+
gif_path: Path to GIF file
|
|
19
|
+
is_emoji: True for emoji (128x128 recommended), False for message GIF
|
|
20
|
+
verbose: Print validation details
|
|
21
|
+
|
|
22
|
+
Returns:
|
|
23
|
+
Tuple of (passes: bool, results: dict with all details)
|
|
24
|
+
"""
|
|
25
|
+
from PIL import Image
|
|
26
|
+
|
|
27
|
+
gif_path = Path(gif_path)
|
|
28
|
+
|
|
29
|
+
if not gif_path.exists():
|
|
30
|
+
return False, {"error": f"File not found: {gif_path}"}
|
|
31
|
+
|
|
32
|
+
# Get file size
|
|
33
|
+
size_bytes = gif_path.stat().st_size
|
|
34
|
+
size_kb = size_bytes / 1024
|
|
35
|
+
size_mb = size_kb / 1024
|
|
36
|
+
|
|
37
|
+
# Get dimensions and frame info
|
|
38
|
+
try:
|
|
39
|
+
with Image.open(gif_path) as img:
|
|
40
|
+
width, height = img.size
|
|
41
|
+
|
|
42
|
+
# Count frames
|
|
43
|
+
frame_count = 0
|
|
44
|
+
try:
|
|
45
|
+
while True:
|
|
46
|
+
img.seek(frame_count)
|
|
47
|
+
frame_count += 1
|
|
48
|
+
except EOFError:
|
|
49
|
+
pass
|
|
50
|
+
|
|
51
|
+
# Get duration
|
|
52
|
+
try:
|
|
53
|
+
duration_ms = img.info.get("duration", 100)
|
|
54
|
+
total_duration = (duration_ms * frame_count) / 1000
|
|
55
|
+
fps = frame_count / total_duration if total_duration > 0 else 0
|
|
56
|
+
except:
|
|
57
|
+
total_duration = None
|
|
58
|
+
fps = None
|
|
59
|
+
|
|
60
|
+
except Exception as e:
|
|
61
|
+
return False, {"error": f"Failed to read GIF: {e}"}
|
|
62
|
+
|
|
63
|
+
# Validate dimensions
|
|
64
|
+
if is_emoji:
|
|
65
|
+
optimal = width == height == 128
|
|
66
|
+
acceptable = width == height and 64 <= width <= 128
|
|
67
|
+
dim_pass = acceptable
|
|
68
|
+
else:
|
|
69
|
+
aspect_ratio = (
|
|
70
|
+
max(width, height) / min(width, height)
|
|
71
|
+
if min(width, height) > 0
|
|
72
|
+
else float("inf")
|
|
73
|
+
)
|
|
74
|
+
dim_pass = aspect_ratio <= 2.0 and 320 <= min(width, height) <= 640
|
|
75
|
+
|
|
76
|
+
results = {
|
|
77
|
+
"file": str(gif_path),
|
|
78
|
+
"passes": dim_pass,
|
|
79
|
+
"width": width,
|
|
80
|
+
"height": height,
|
|
81
|
+
"size_kb": size_kb,
|
|
82
|
+
"size_mb": size_mb,
|
|
83
|
+
"frame_count": frame_count,
|
|
84
|
+
"duration_seconds": total_duration,
|
|
85
|
+
"fps": fps,
|
|
86
|
+
"is_emoji": is_emoji,
|
|
87
|
+
"optimal": optimal if is_emoji else None,
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
# Print if verbose
|
|
91
|
+
if verbose:
|
|
92
|
+
print(f"\nValidating {gif_path.name}:")
|
|
93
|
+
print(
|
|
94
|
+
f" Dimensions: {width}x{height}"
|
|
95
|
+
+ (
|
|
96
|
+
f" ({'optimal' if optimal else 'acceptable'})"
|
|
97
|
+
if is_emoji and acceptable
|
|
98
|
+
else ""
|
|
99
|
+
)
|
|
100
|
+
)
|
|
101
|
+
print(
|
|
102
|
+
f" Size: {size_kb:.1f} KB"
|
|
103
|
+
+ (f" ({size_mb:.2f} MB)" if size_mb >= 1.0 else "")
|
|
104
|
+
)
|
|
105
|
+
print(
|
|
106
|
+
f" Frames: {frame_count}"
|
|
107
|
+
+ (f" @ {fps:.1f} fps ({total_duration:.1f}s)" if fps else "")
|
|
108
|
+
)
|
|
109
|
+
|
|
110
|
+
if not dim_pass:
|
|
111
|
+
print(
|
|
112
|
+
f" Note: {'Emoji should be 128x128' if is_emoji else 'Unusual dimensions for Slack'}"
|
|
113
|
+
)
|
|
114
|
+
|
|
115
|
+
if size_mb > 5.0:
|
|
116
|
+
print(f" Note: Large file size - consider fewer frames/colors")
|
|
117
|
+
|
|
118
|
+
return dim_pass, results
|
|
119
|
+
|
|
120
|
+
|
|
121
|
+
def is_slack_ready(
|
|
122
|
+
gif_path: str | Path, is_emoji: bool = True, verbose: bool = True
|
|
123
|
+
) -> bool:
|
|
124
|
+
"""
|
|
125
|
+
Quick check if GIF is ready for Slack.
|
|
126
|
+
|
|
127
|
+
Args:
|
|
128
|
+
gif_path: Path to GIF file
|
|
129
|
+
is_emoji: True for emoji GIF, False for message GIF
|
|
130
|
+
verbose: Print feedback
|
|
131
|
+
|
|
132
|
+
Returns:
|
|
133
|
+
True if dimensions are acceptable
|
|
134
|
+
"""
|
|
135
|
+
passes, _ = validate_gif(gif_path, is_emoji, verbose)
|
|
136
|
+
return passes
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: staff-engineer-review
|
|
3
|
+
description: Performs deep code review of pull requests as a Staff+ level engineer. This skill should be used when reviewing PRs, evaluating implementation against plans, assessing architectural decisions, code quality, and providing actionable feedback.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Staff Engineer Review
|
|
7
|
+
|
|
8
|
+
## Overview
|
|
9
|
+
|
|
10
|
+
Perform rigorous code review of pull requests by comparing the original plan (PR description) against actual implementation (code changes, diffs, structure). Evaluate alignment, architecture, code quality, correctness, performance, and test coverage to provide structured, actionable feedback.
|
|
11
|
+
|
|
12
|
+
## When to Use This Skill
|
|
13
|
+
|
|
14
|
+
This skill should be used when:
|
|
15
|
+
- Review a pull request and provide a structured evaluation
|
|
16
|
+
- Evaluate whether implementation matches the stated plan
|
|
17
|
+
- Assess architectural decisions in PRs
|
|
18
|
+
- Provide detailed code review feedback
|
|
19
|
+
- Check code quality, correctness, and performance implications
|
|
20
|
+
- Evaluate test coverage adequacy
|
|
21
|
+
|
|
22
|
+
## Review Workflow
|
|
23
|
+
|
|
24
|
+
### 1. Gather Inputs
|
|
25
|
+
|
|
26
|
+
Collect the following:
|
|
27
|
+
- **PR Description** - The original plan and intent
|
|
28
|
+
- **Code Changes** - Diffs, files modified, commits
|
|
29
|
+
- **Additional Context** - Optional background, architecture docs, related PRs
|
|
30
|
+
|
|
31
|
+
### 2. Plan vs Implementation Alignment
|
|
32
|
+
|
|
33
|
+
Evaluate each item in the PR description against actual changes:
|
|
34
|
+
|
|
35
|
+
| Check | Description |
|
|
36
|
+
|-------|-------------|
|
|
37
|
+
| Missing parts | Items planned but not implemented |
|
|
38
|
+
| Extra changes | Changes implemented but not planned |
|
|
39
|
+
| Partial implementations | Features started but not completed |
|
|
40
|
+
|
|
41
|
+
Document each discrepancy with status: ✅ Done, ⚠️ Partial, ❌ Missing, ➕ Extra
|
|
42
|
+
|
|
43
|
+
### 3. Architectural & Design Review
|
|
44
|
+
|
|
45
|
+
Evaluate implementation against principles:
|
|
46
|
+
|
|
47
|
+
**Assess:**
|
|
48
|
+
- Separation of concerns
|
|
49
|
+
- Coupling and cohesion
|
|
50
|
+
- Consistency with existing codebase patterns
|
|
51
|
+
- Scalability implications
|
|
52
|
+
|
|
53
|
+
**Identify:**
|
|
54
|
+
- Design flaws or anti-patterns
|
|
55
|
+
- Overengineering or underengineering
|
|
56
|
+
- Hidden complexity
|
|
57
|
+
- Violations of SOLID/DRY principles
|
|
58
|
+
|
|
59
|
+
### 4. Code Quality Review
|
|
60
|
+
|
|
61
|
+
Check for:
|
|
62
|
+
- Readability and clarity
|
|
63
|
+
- Naming consistency with codebase conventions
|
|
64
|
+
- Function and class responsibilities (single responsibility)
|
|
65
|
+
- Code duplication
|
|
66
|
+
- Cyclomatic and cognitive complexity
|
|
67
|
+
- Edge case handling
|
|
68
|
+
- Error handling completeness
|
|
69
|
+
- Logging and observability
|
|
70
|
+
|
|
71
|
+
### 5. Correctness & Risk Analysis
|
|
72
|
+
|
|
73
|
+
Identify:
|
|
74
|
+
- Logical errors or questionable assumptions
|
|
75
|
+
- Potential bugs or edge case failures
|
|
76
|
+
- Missing input validation
|
|
77
|
+
- Race conditions or concurrency issues
|
|
78
|
+
- Security vulnerabilities (injection, auth, data exposure)
|
|
79
|
+
- API contract violations
|
|
80
|
+
- Error handling gaps
|
|
81
|
+
|
|
82
|
+
### 6. Performance Considerations
|
|
83
|
+
|
|
84
|
+
Identify:
|
|
85
|
+
- N+1 query patterns
|
|
86
|
+
- Inefficient loops or operations
|
|
87
|
+
- Memory inefficiencies
|
|
88
|
+
- Unnecessary computations
|
|
89
|
+
- Missing indexes or caching opportunities
|
|
90
|
+
- Blocking operations in hot paths
|
|
91
|
+
- Large data processing without streaming
|
|
92
|
+
|
|
93
|
+
### 7. Test Coverage Evaluation
|
|
94
|
+
|
|
95
|
+
Assess:
|
|
96
|
+
- Unit tests for new functionality
|
|
97
|
+
- Integration tests for component interactions
|
|
98
|
+
- Edge case coverage
|
|
99
|
+
- Happy path vs error path testing
|
|
100
|
+
|
|
101
|
+
Identify missing tests and suggest specific test cases.
|
|
102
|
+
|
|
103
|
+
## Output Format
|
|
104
|
+
|
|
105
|
+
### 1. Summary
|
|
106
|
+
|
|
107
|
+
Provide:
|
|
108
|
+
- **Alignment Score**: 0-100% (plan vs implementation)
|
|
109
|
+
- **Overall Quality**: Excellent / Good / Fair / Poor
|
|
110
|
+
- **Risk Level**: Low / Medium / High
|
|
111
|
+
|
|
112
|
+
### 2. Plan vs Reality
|
|
113
|
+
|
|
114
|
+
| Item | Planned | Implemented | Status | Notes |
|
|
115
|
+
|------|---------|-------------|--------|-------|
|
|
116
|
+
| [Item 1] | Description from PR | What was actually done | ✅/⚠️/❌/➕ | Explanation |
|
|
117
|
+
|
|
118
|
+
### 3. Critical Issues
|
|
119
|
+
|
|
120
|
+
List only high-impact problems (if any):
|
|
121
|
+
|
|
122
|
+
- **[Issue Title]**
|
|
123
|
+
- **Why it matters**: [Impact explanation]
|
|
124
|
+
- **Suggested fix**: [Concrete recommendation]
|
|
125
|
+
|
|
126
|
+
### 4. Improvement Opportunities
|
|
127
|
+
|
|
128
|
+
Group by category:
|
|
129
|
+
|
|
130
|
+
**Architecture:**
|
|
131
|
+
- [Issue] - [Recommendation]
|
|
132
|
+
|
|
133
|
+
**Code Quality:**
|
|
134
|
+
- [Issue] - [Recommendation]
|
|
135
|
+
|
|
136
|
+
**Performance:**
|
|
137
|
+
- [Issue] - [Recommendation]
|
|
138
|
+
|
|
139
|
+
**Tests:**
|
|
140
|
+
- [Issue] - [Recommendation]
|
|
141
|
+
|
|
142
|
+
### 5. Suggested Additions to PR
|
|
143
|
+
|
|
144
|
+
- Missing features or logic
|
|
145
|
+
- Better approaches or patterns
|
|
146
|
+
- Additional safeguards or validations
|
|
147
|
+
|
|
148
|
+
### 6. Test Recommendations
|
|
149
|
+
|
|
150
|
+
Specific test cases to add:
|
|
151
|
+
|
|
152
|
+
- **[Test Case Name]**
|
|
153
|
+
- Input: [What to test]
|
|
154
|
+
- Expected: [Expected behavior]
|
|
155
|
+
|
|
156
|
+
## Style Requirements
|
|
157
|
+
|
|
158
|
+
- Be precise and structured
|
|
159
|
+
- Avoid generic advice
|
|
160
|
+
- Focus on actionable insights
|
|
161
|
+
- Prioritize high-impact issues
|
|
162
|
+
- Use bullet points and tables
|
|
163
|
+
- Reference specific files and line numbers
|
|
164
|
+
- State assumptions explicitly when information is unclear
|
|
165
|
+
- Prefer practical engineering judgment over theoretical purity
|
|
166
|
+
|
|
167
|
+
## Important Notes
|
|
168
|
+
|
|
169
|
+
- Verify everything; do not assume correctness
|
|
170
|
+
- Consider the context of the codebase and team conventions
|
|
171
|
+
- Balance perfectionism with pragmatism
|
|
172
|
+
- Focus review on what matters most for the PR's success
|