@bastani/atomic 0.5.11 → 0.5.12-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/.agents/skills/adapt/SKILL.md +199 -0
- package/.agents/skills/advanced-evaluation/SKILL.md +402 -0
- package/.agents/skills/advanced-evaluation/references/bias-mitigation.md +288 -0
- package/.agents/skills/advanced-evaluation/references/evaluation-pipeline.md +43 -0
- package/.agents/skills/advanced-evaluation/references/implementation-patterns.md +315 -0
- package/.agents/skills/advanced-evaluation/references/metrics-guide.md +331 -0
- package/.agents/skills/advanced-evaluation/scripts/evaluation_example.py +392 -0
- package/.agents/skills/animate/SKILL.md +175 -0
- package/.agents/skills/arrange/SKILL.md +124 -0
- package/.agents/skills/audit/SKILL.md +148 -0
- package/.agents/skills/bdi-mental-states/SKILL.md +311 -0
- package/.agents/skills/bdi-mental-states/references/bdi-ontology-core.md +207 -0
- package/.agents/skills/bdi-mental-states/references/framework-integration.md +582 -0
- package/.agents/skills/bdi-mental-states/references/rdf-examples.md +315 -0
- package/.agents/skills/bdi-mental-states/references/sparql-competency.md +420 -0
- package/.agents/skills/bolder/SKILL.md +117 -0
- package/.agents/skills/bun/SKILL.md +199 -0
- package/.agents/skills/clarify/SKILL.md +183 -0
- package/.agents/skills/colorize/SKILL.md +143 -0
- package/.agents/skills/context-compression/SKILL.md +272 -0
- package/.agents/skills/context-compression/references/evaluation-framework.md +213 -0
- package/.agents/skills/context-compression/scripts/compression_evaluator.py +862 -0
- package/.agents/skills/context-compression/tests/test_compression_evaluator.py +56 -0
- package/.agents/skills/context-degradation/SKILL.md +206 -0
- package/.agents/skills/context-degradation/references/patterns.md +314 -0
- package/.agents/skills/context-degradation/scripts/degradation_detector.py +614 -0
- package/.agents/skills/context-fundamentals/SKILL.md +201 -0
- package/.agents/skills/context-fundamentals/references/context-components.md +283 -0
- package/.agents/skills/context-fundamentals/scripts/context_manager.py +533 -0
- package/.agents/skills/context-optimization/SKILL.md +195 -0
- package/.agents/skills/context-optimization/references/optimization_techniques.md +272 -0
- package/.agents/skills/context-optimization/scripts/compaction.py +562 -0
- package/.agents/skills/create-spec/SKILL.md +244 -0
- package/.agents/skills/critique/SKILL.md +225 -0
- package/.agents/skills/critique/reference/cognitive-load.md +106 -0
- package/.agents/skills/critique/reference/heuristics-scoring.md +234 -0
- package/.agents/skills/critique/reference/personas.md +178 -0
- package/.agents/skills/delight/SKILL.md +304 -0
- package/.agents/skills/distill/SKILL.md +122 -0
- package/.agents/skills/docx/LICENSE.txt +30 -0
- package/.agents/skills/docx/SKILL.md +590 -0
- package/.agents/skills/docx/scripts/__init__.py +1 -0
- package/.agents/skills/docx/scripts/accept_changes.py +135 -0
- package/.agents/skills/docx/scripts/comment.py +318 -0
- package/.agents/skills/docx/scripts/office/helpers/__init__.py +0 -0
- package/.agents/skills/docx/scripts/office/helpers/merge_runs.py +199 -0
- package/.agents/skills/docx/scripts/office/helpers/simplify_redlines.py +197 -0
- package/.agents/skills/docx/scripts/office/pack.py +159 -0
- package/.agents/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +1499 -0
- package/.agents/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +146 -0
- package/.agents/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +1085 -0
- package/.agents/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +11 -0
- package/.agents/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-main.xsd +3081 -0
- package/.agents/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +23 -0
- package/.agents/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +185 -0
- package/.agents/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +287 -0
- package/.agents/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/pml.xsd +1676 -0
- package/.agents/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +28 -0
- package/.agents/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +144 -0
- package/.agents/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +174 -0
- package/.agents/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +25 -0
- package/.agents/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +18 -0
- package/.agents/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +59 -0
- package/.agents/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +56 -0
- package/.agents/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +195 -0
- package/.agents/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-math.xsd +582 -0
- package/.agents/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +25 -0
- package/.agents/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/sml.xsd +4439 -0
- package/.agents/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-main.xsd +570 -0
- package/.agents/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +509 -0
- package/.agents/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +12 -0
- package/.agents/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +108 -0
- package/.agents/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +96 -0
- package/.agents/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/wml.xsd +3646 -0
- package/.agents/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/xml.xsd +116 -0
- package/.agents/skills/docx/scripts/office/schemas/ecma/fouth-edition/opc-contentTypes.xsd +42 -0
- package/.agents/skills/docx/scripts/office/schemas/ecma/fouth-edition/opc-coreProperties.xsd +50 -0
- package/.agents/skills/docx/scripts/office/schemas/ecma/fouth-edition/opc-digSig.xsd +49 -0
- package/.agents/skills/docx/scripts/office/schemas/ecma/fouth-edition/opc-relationships.xsd +33 -0
- package/.agents/skills/docx/scripts/office/schemas/mce/mc.xsd +75 -0
- package/.agents/skills/docx/scripts/office/schemas/microsoft/wml-2010.xsd +560 -0
- package/.agents/skills/docx/scripts/office/schemas/microsoft/wml-2012.xsd +67 -0
- package/.agents/skills/docx/scripts/office/schemas/microsoft/wml-2018.xsd +14 -0
- package/.agents/skills/docx/scripts/office/schemas/microsoft/wml-cex-2018.xsd +20 -0
- package/.agents/skills/docx/scripts/office/schemas/microsoft/wml-cid-2016.xsd +13 -0
- package/.agents/skills/docx/scripts/office/schemas/microsoft/wml-sdtdatahash-2020.xsd +4 -0
- package/.agents/skills/docx/scripts/office/schemas/microsoft/wml-symex-2015.xsd +8 -0
- package/.agents/skills/docx/scripts/office/soffice.py +183 -0
- package/.agents/skills/docx/scripts/office/unpack.py +132 -0
- package/.agents/skills/docx/scripts/office/validate.py +111 -0
- package/.agents/skills/docx/scripts/office/validators/__init__.py +15 -0
- package/.agents/skills/docx/scripts/office/validators/base.py +847 -0
- package/.agents/skills/docx/scripts/office/validators/docx.py +446 -0
- package/.agents/skills/docx/scripts/office/validators/pptx.py +275 -0
- package/.agents/skills/docx/scripts/office/validators/redlining.py +247 -0
- package/.agents/skills/docx/scripts/templates/comments.xml +3 -0
- package/.agents/skills/docx/scripts/templates/commentsExtended.xml +3 -0
- package/.agents/skills/docx/scripts/templates/commentsExtensible.xml +3 -0
- package/.agents/skills/docx/scripts/templates/commentsIds.xml +3 -0
- package/.agents/skills/docx/scripts/templates/people.xml +3 -0
- package/.agents/skills/evaluation/SKILL.md +251 -0
- package/.agents/skills/evaluation/references/metrics.md +339 -0
- package/.agents/skills/evaluation/scripts/evaluator.py +627 -0
- package/.agents/skills/explain-code/SKILL.md +230 -0
- package/.agents/skills/extract/SKILL.md +91 -0
- package/.agents/skills/filesystem-context/SKILL.md +287 -0
- package/.agents/skills/filesystem-context/references/implementation-patterns.md +549 -0
- package/.agents/skills/filesystem-context/scripts/filesystem_context.py +425 -0
- package/.agents/skills/find-skills/SKILL.md +142 -0
- package/.agents/skills/frontend-design/SKILL.md +147 -0
- package/.agents/skills/frontend-design/reference/color-and-contrast.md +132 -0
- package/.agents/skills/frontend-design/reference/interaction-design.md +195 -0
- package/.agents/skills/frontend-design/reference/motion-design.md +99 -0
- package/.agents/skills/frontend-design/reference/responsive-design.md +114 -0
- package/.agents/skills/frontend-design/reference/spatial-design.md +100 -0
- package/.agents/skills/frontend-design/reference/typography.md +133 -0
- package/.agents/skills/frontend-design/reference/ux-writing.md +107 -0
- package/.agents/skills/gh-commit/SKILL.md +243 -0
- package/.agents/skills/gh-create-pr/SKILL.md +93 -0
- package/.agents/skills/harden/SKILL.md +354 -0
- package/.agents/skills/hosted-agents/SKILL.md +260 -0
- package/.agents/skills/hosted-agents/references/infrastructure-patterns.md +700 -0
- package/.agents/skills/hosted-agents/scripts/sandbox_manager.py +590 -0
- package/.agents/skills/impeccable/SKILL.md +365 -0
- package/.agents/skills/impeccable/reference/color-and-contrast.md +105 -0
- package/.agents/skills/impeccable/reference/craft.md +70 -0
- package/.agents/skills/impeccable/reference/extract.md +70 -0
- package/.agents/skills/impeccable/reference/interaction-design.md +195 -0
- package/.agents/skills/impeccable/reference/motion-design.md +99 -0
- package/.agents/skills/impeccable/reference/responsive-design.md +114 -0
- package/.agents/skills/impeccable/reference/spatial-design.md +100 -0
- package/.agents/skills/impeccable/reference/typography.md +142 -0
- package/.agents/skills/impeccable/reference/ux-writing.md +107 -0
- package/.agents/skills/impeccable/scripts/cleanup-deprecated.mjs +214 -0
- package/.agents/skills/init/SKILL.md +138 -0
- package/.agents/skills/layout/SKILL.md +125 -0
- package/.agents/skills/liteparse/SKILL.md +222 -0
- package/.agents/skills/memory-systems/SKILL.md +219 -0
- package/.agents/skills/memory-systems/references/implementation.md +551 -0
- package/.agents/skills/memory-systems/scripts/memory_store.py +616 -0
- package/.agents/skills/multi-agent-patterns/SKILL.md +257 -0
- package/.agents/skills/multi-agent-patterns/references/frameworks.md +433 -0
- package/.agents/skills/multi-agent-patterns/scripts/coordination.py +613 -0
- package/.agents/skills/normalize/SKILL.md +70 -0
- package/.agents/skills/onboard/SKILL.md +245 -0
- package/.agents/skills/opentui/SKILL.md +201 -0
- package/.agents/skills/opentui/references/animation/REFERENCE.md +431 -0
- package/.agents/skills/opentui/references/components/REFERENCE.md +144 -0
- package/.agents/skills/opentui/references/components/code-diff.md +672 -0
- package/.agents/skills/opentui/references/components/containers.md +417 -0
- package/.agents/skills/opentui/references/components/inputs.md +531 -0
- package/.agents/skills/opentui/references/components/text-display.md +386 -0
- package/.agents/skills/opentui/references/core/REFERENCE.md +145 -0
- package/.agents/skills/opentui/references/core/api.md +543 -0
- package/.agents/skills/opentui/references/core/configuration.md +168 -0
- package/.agents/skills/opentui/references/core/gotchas.md +393 -0
- package/.agents/skills/opentui/references/core/patterns.md +449 -0
- package/.agents/skills/opentui/references/keyboard/REFERENCE.md +617 -0
- package/.agents/skills/opentui/references/layout/REFERENCE.md +337 -0
- package/.agents/skills/opentui/references/layout/patterns.md +444 -0
- package/.agents/skills/opentui/references/react/REFERENCE.md +174 -0
- package/.agents/skills/opentui/references/react/api.md +436 -0
- package/.agents/skills/opentui/references/react/configuration.md +302 -0
- package/.agents/skills/opentui/references/react/gotchas.md +443 -0
- package/.agents/skills/opentui/references/react/patterns.md +501 -0
- package/.agents/skills/opentui/references/solid/REFERENCE.md +201 -0
- package/.agents/skills/opentui/references/solid/api.md +564 -0
- package/.agents/skills/opentui/references/solid/configuration.md +316 -0
- package/.agents/skills/opentui/references/solid/gotchas.md +427 -0
- package/.agents/skills/opentui/references/solid/patterns.md +560 -0
- package/.agents/skills/opentui/references/testing/REFERENCE.md +614 -0
- package/.agents/skills/optimize/SKILL.md +266 -0
- package/.agents/skills/overdrive/SKILL.md +142 -0
- package/.agents/skills/pdf/LICENSE.txt +30 -0
- package/.agents/skills/pdf/SKILL.md +314 -0
- package/.agents/skills/pdf/forms.md +294 -0
- package/.agents/skills/pdf/reference.md +612 -0
- package/.agents/skills/pdf/scripts/check_bounding_boxes.py +65 -0
- package/.agents/skills/pdf/scripts/check_fillable_fields.py +11 -0
- package/.agents/skills/pdf/scripts/convert_pdf_to_images.py +33 -0
- package/.agents/skills/pdf/scripts/create_validation_image.py +37 -0
- package/.agents/skills/pdf/scripts/extract_form_field_info.py +122 -0
- package/.agents/skills/pdf/scripts/extract_form_structure.py +115 -0
- package/.agents/skills/pdf/scripts/fill_fillable_fields.py +98 -0
- package/.agents/skills/pdf/scripts/fill_pdf_form_with_annotations.py +107 -0
- package/.agents/skills/playwright-cli/SKILL.md +344 -0
- package/.agents/skills/playwright-cli/references/element-attributes.md +23 -0
- package/.agents/skills/playwright-cli/references/playwright-tests.md +39 -0
- package/.agents/skills/playwright-cli/references/request-mocking.md +87 -0
- package/.agents/skills/playwright-cli/references/running-code.md +231 -0
- package/.agents/skills/playwright-cli/references/session-management.md +169 -0
- package/.agents/skills/playwright-cli/references/storage-state.md +275 -0
- package/.agents/skills/playwright-cli/references/test-generation.md +88 -0
- package/.agents/skills/playwright-cli/references/tracing.md +139 -0
- package/.agents/skills/playwright-cli/references/video-recording.md +143 -0
- package/.agents/skills/polish/SKILL.md +224 -0
- package/.agents/skills/pptx/LICENSE.txt +30 -0
- package/.agents/skills/pptx/SKILL.md +232 -0
- package/.agents/skills/pptx/editing.md +205 -0
- package/.agents/skills/pptx/pptxgenjs.md +420 -0
- package/.agents/skills/pptx/scripts/__init__.py +0 -0
- package/.agents/skills/pptx/scripts/add_slide.py +195 -0
- package/.agents/skills/pptx/scripts/clean.py +286 -0
- package/.agents/skills/pptx/scripts/office/helpers/__init__.py +0 -0
- package/.agents/skills/pptx/scripts/office/helpers/merge_runs.py +199 -0
- package/.agents/skills/pptx/scripts/office/helpers/simplify_redlines.py +197 -0
- package/.agents/skills/pptx/scripts/office/pack.py +159 -0
- package/.agents/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +1499 -0
- package/.agents/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +146 -0
- package/.agents/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +1085 -0
- package/.agents/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +11 -0
- package/.agents/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-main.xsd +3081 -0
- package/.agents/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +23 -0
- package/.agents/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +185 -0
- package/.agents/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +287 -0
- package/.agents/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/pml.xsd +1676 -0
- package/.agents/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +28 -0
- package/.agents/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +144 -0
- package/.agents/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +174 -0
- package/.agents/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +25 -0
- package/.agents/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +18 -0
- package/.agents/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +59 -0
- package/.agents/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +56 -0
- package/.agents/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +195 -0
- package/.agents/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-math.xsd +582 -0
- package/.agents/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +25 -0
- package/.agents/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/sml.xsd +4439 -0
- package/.agents/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-main.xsd +570 -0
- package/.agents/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +509 -0
- package/.agents/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +12 -0
- package/.agents/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +108 -0
- package/.agents/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +96 -0
- package/.agents/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/wml.xsd +3646 -0
- package/.agents/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/xml.xsd +116 -0
- package/.agents/skills/pptx/scripts/office/schemas/ecma/fouth-edition/opc-contentTypes.xsd +42 -0
- package/.agents/skills/pptx/scripts/office/schemas/ecma/fouth-edition/opc-coreProperties.xsd +50 -0
- package/.agents/skills/pptx/scripts/office/schemas/ecma/fouth-edition/opc-digSig.xsd +49 -0
- package/.agents/skills/pptx/scripts/office/schemas/ecma/fouth-edition/opc-relationships.xsd +33 -0
- package/.agents/skills/pptx/scripts/office/schemas/mce/mc.xsd +75 -0
- package/.agents/skills/pptx/scripts/office/schemas/microsoft/wml-2010.xsd +560 -0
- package/.agents/skills/pptx/scripts/office/schemas/microsoft/wml-2012.xsd +67 -0
- package/.agents/skills/pptx/scripts/office/schemas/microsoft/wml-2018.xsd +14 -0
- package/.agents/skills/pptx/scripts/office/schemas/microsoft/wml-cex-2018.xsd +20 -0
- package/.agents/skills/pptx/scripts/office/schemas/microsoft/wml-cid-2016.xsd +13 -0
- package/.agents/skills/pptx/scripts/office/schemas/microsoft/wml-sdtdatahash-2020.xsd +4 -0
- package/.agents/skills/pptx/scripts/office/schemas/microsoft/wml-symex-2015.xsd +8 -0
- package/.agents/skills/pptx/scripts/office/soffice.py +183 -0
- package/.agents/skills/pptx/scripts/office/unpack.py +132 -0
- package/.agents/skills/pptx/scripts/office/validate.py +111 -0
- package/.agents/skills/pptx/scripts/office/validators/__init__.py +15 -0
- package/.agents/skills/pptx/scripts/office/validators/base.py +847 -0
- package/.agents/skills/pptx/scripts/office/validators/docx.py +446 -0
- package/.agents/skills/pptx/scripts/office/validators/pptx.py +275 -0
- package/.agents/skills/pptx/scripts/office/validators/redlining.py +247 -0
- package/.agents/skills/pptx/scripts/thumbnail.py +289 -0
- package/.agents/skills/project-development/SKILL.md +291 -0
- package/.agents/skills/project-development/references/case-studies.md +388 -0
- package/.agents/skills/project-development/references/pipeline-patterns.md +610 -0
- package/.agents/skills/project-development/scripts/pipeline_template.py +796 -0
- package/.agents/skills/prompt-engineer/SKILL.md +263 -0
- package/.agents/skills/prompt-engineer/references/advanced_patterns.md +271 -0
- package/.agents/skills/prompt-engineer/references/core_prompting.md +137 -0
- package/.agents/skills/prompt-engineer/references/quality_improvement.md +193 -0
- package/.agents/skills/quieter/SKILL.md +103 -0
- package/.agents/skills/research-codebase/SKILL.md +227 -0
- package/.agents/skills/shape/SKILL.md +96 -0
- package/.agents/skills/skill-creator/LICENSE.txt +202 -0
- package/.agents/skills/skill-creator/SKILL.md +485 -0
- package/.agents/skills/skill-creator/agents/analyzer.md +274 -0
- package/.agents/skills/skill-creator/agents/comparator.md +202 -0
- package/.agents/skills/skill-creator/agents/grader.md +223 -0
- package/.agents/skills/skill-creator/assets/eval_review.html +146 -0
- package/.agents/skills/skill-creator/eval-viewer/generate_review.py +471 -0
- package/.agents/skills/skill-creator/eval-viewer/viewer.html +1325 -0
- package/.agents/skills/skill-creator/references/schemas.md +430 -0
- package/.agents/skills/skill-creator/scripts/__init__.py +0 -0
- package/.agents/skills/skill-creator/scripts/aggregate_benchmark.py +401 -0
- package/.agents/skills/skill-creator/scripts/generate_report.py +326 -0
- package/.agents/skills/skill-creator/scripts/improve_description.py +247 -0
- package/.agents/skills/skill-creator/scripts/package_skill.py +136 -0
- package/.agents/skills/skill-creator/scripts/quick_validate.py +103 -0
- package/.agents/skills/skill-creator/scripts/run_eval.py +310 -0
- package/.agents/skills/skill-creator/scripts/run_loop.py +328 -0
- package/.agents/skills/skill-creator/scripts/utils.py +47 -0
- package/.agents/skills/sl-commit/SKILL.md +51 -0
- package/.agents/skills/sl-submit-diff/SKILL.md +55 -0
- package/.agents/skills/teach-impeccable/SKILL.md +71 -0
- package/.agents/skills/test-driven-development/SKILL.md +371 -0
- package/.agents/skills/test-driven-development/testing-anti-patterns.md +299 -0
- package/.agents/skills/tool-design/SKILL.md +271 -0
- package/.agents/skills/tool-design/references/architectural_reduction.md +210 -0
- package/.agents/skills/tool-design/references/best_practices.md +176 -0
- package/.agents/skills/tool-design/scripts/description_generator.py +528 -0
- package/.agents/skills/typescript-advanced-types/SKILL.md +719 -0
- package/.agents/skills/typescript-expert/SKILL.md +428 -0
- package/.agents/skills/typescript-expert/references/tsconfig-strict.json +92 -0
- package/.agents/skills/typescript-expert/references/typescript-cheatsheet.md +383 -0
- package/.agents/skills/typescript-expert/references/utility-types.ts +335 -0
- package/.agents/skills/typescript-expert/scripts/ts_diagnostic.py +203 -0
- package/.agents/skills/typescript-react-reviewer/SKILL.md +200 -0
- package/.agents/skills/typescript-react-reviewer/references/antipatterns.md +510 -0
- package/.agents/skills/typescript-react-reviewer/references/checklist.md +267 -0
- package/.agents/skills/typescript-react-reviewer/references/react19-patterns.md +305 -0
- package/.agents/skills/typeset/SKILL.md +116 -0
- package/.agents/skills/workflow-creator/SKILL.md +337 -0
- package/.agents/skills/workflow-creator/references/agent-sessions.md +789 -0
- package/.agents/skills/workflow-creator/references/computation-and-validation.md +224 -0
- package/.agents/skills/workflow-creator/references/control-flow.md +450 -0
- package/.agents/skills/workflow-creator/references/discovery-and-verification.md +156 -0
- package/.agents/skills/workflow-creator/references/failure-modes.md +732 -0
- package/.agents/skills/workflow-creator/references/getting-started.md +289 -0
- package/.agents/skills/workflow-creator/references/session-config.md +355 -0
- package/.agents/skills/workflow-creator/references/state-and-data-flow.md +374 -0
- package/.agents/skills/workflow-creator/references/user-input.md +206 -0
- package/.agents/skills/workflow-creator/references/workflow-inputs.md +274 -0
- package/.agents/skills/xlsx/LICENSE.txt +30 -0
- package/.agents/skills/xlsx/SKILL.md +292 -0
- package/.agents/skills/xlsx/scripts/office/helpers/__init__.py +0 -0
- package/.agents/skills/xlsx/scripts/office/helpers/merge_runs.py +199 -0
- package/.agents/skills/xlsx/scripts/office/helpers/simplify_redlines.py +197 -0
- package/.agents/skills/xlsx/scripts/office/pack.py +159 -0
- package/.agents/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +1499 -0
- package/.agents/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +146 -0
- package/.agents/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +1085 -0
- package/.agents/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +11 -0
- package/.agents/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-main.xsd +3081 -0
- package/.agents/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +23 -0
- package/.agents/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +185 -0
- package/.agents/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +287 -0
- package/.agents/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/pml.xsd +1676 -0
- package/.agents/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +28 -0
- package/.agents/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +144 -0
- package/.agents/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +174 -0
- package/.agents/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +25 -0
- package/.agents/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +18 -0
- package/.agents/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +59 -0
- package/.agents/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +56 -0
- package/.agents/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +195 -0
- package/.agents/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-math.xsd +582 -0
- package/.agents/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +25 -0
- package/.agents/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/sml.xsd +4439 -0
- package/.agents/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-main.xsd +570 -0
- package/.agents/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +509 -0
- package/.agents/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +12 -0
- package/.agents/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +108 -0
- package/.agents/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +96 -0
- package/.agents/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/wml.xsd +3646 -0
- package/.agents/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/xml.xsd +116 -0
- package/.agents/skills/xlsx/scripts/office/schemas/ecma/fouth-edition/opc-contentTypes.xsd +42 -0
- package/.agents/skills/xlsx/scripts/office/schemas/ecma/fouth-edition/opc-coreProperties.xsd +50 -0
- package/.agents/skills/xlsx/scripts/office/schemas/ecma/fouth-edition/opc-digSig.xsd +49 -0
- package/.agents/skills/xlsx/scripts/office/schemas/ecma/fouth-edition/opc-relationships.xsd +33 -0
- package/.agents/skills/xlsx/scripts/office/schemas/mce/mc.xsd +75 -0
- package/.agents/skills/xlsx/scripts/office/schemas/microsoft/wml-2010.xsd +560 -0
- package/.agents/skills/xlsx/scripts/office/schemas/microsoft/wml-2012.xsd +67 -0
- package/.agents/skills/xlsx/scripts/office/schemas/microsoft/wml-2018.xsd +14 -0
- package/.agents/skills/xlsx/scripts/office/schemas/microsoft/wml-cex-2018.xsd +20 -0
- package/.agents/skills/xlsx/scripts/office/schemas/microsoft/wml-cid-2016.xsd +13 -0
- package/.agents/skills/xlsx/scripts/office/schemas/microsoft/wml-sdtdatahash-2020.xsd +4 -0
- package/.agents/skills/xlsx/scripts/office/schemas/microsoft/wml-symex-2015.xsd +8 -0
- package/.agents/skills/xlsx/scripts/office/soffice.py +183 -0
- package/.agents/skills/xlsx/scripts/office/unpack.py +132 -0
- package/.agents/skills/xlsx/scripts/office/validate.py +111 -0
- package/.agents/skills/xlsx/scripts/office/validators/__init__.py +15 -0
- package/.agents/skills/xlsx/scripts/office/validators/base.py +847 -0
- package/.agents/skills/xlsx/scripts/office/validators/docx.py +446 -0
- package/.agents/skills/xlsx/scripts/office/validators/pptx.py +275 -0
- package/.agents/skills/xlsx/scripts/office/validators/redlining.py +247 -0
- package/.agents/skills/xlsx/scripts/recalc.py +184 -0
- package/.claude/agents/reviewer.md +1 -0
- package/.github/agents/reviewer.md +1 -0
- package/.opencode/agents/reviewer.md +1 -0
- package/README.md +274 -169
- package/package.json +6 -7
- package/src/commands/cli/init/index.ts +2 -2
- package/src/commands/cli/init/scm.ts +7 -8
- package/src/commands/cli/workflow-command.test.ts +74 -0
- package/src/commands/cli/workflow.ts +7 -2
- package/src/scripts/bundle-configs.ts +128 -0
- package/src/sdk/components/compact-switcher.tsx +1 -1
- package/src/sdk/components/orchestrator-panel-store.ts +13 -0
- package/src/sdk/components/orchestrator-panel.tsx +10 -0
- package/src/sdk/components/statusline.tsx +13 -1
- package/src/sdk/providers/claude.ts +42 -0
- package/src/sdk/runtime/executor.ts +111 -32
- package/src/sdk/types.ts +7 -0
- package/src/sdk/workflows/builtin/ralph/claude/index.ts +132 -76
- package/src/sdk/workflows/builtin/ralph/copilot/index.ts +129 -71
- package/src/sdk/workflows/builtin/ralph/helpers/git.ts +184 -17
- package/src/sdk/workflows/builtin/ralph/helpers/prompts.ts +463 -79
- package/src/sdk/workflows/builtin/ralph/opencode/index.ts +124 -80
- package/src/services/system/auto-sync.ts +31 -51
- package/src/services/system/skills.ts +56 -60
- package/dist/lib/path-root-guard.d.ts +0 -4
- package/dist/lib/path-root-guard.d.ts.map +0 -1
- package/dist/sdk/components/color-utils.d.ts +0 -4
- package/dist/sdk/components/color-utils.d.ts.map +0 -1
- package/dist/sdk/components/compact-switcher.d.ts +0 -10
- package/dist/sdk/components/compact-switcher.d.ts.map +0 -1
- package/dist/sdk/components/connectors.d.ts +0 -15
- package/dist/sdk/components/connectors.d.ts.map +0 -1
- package/dist/sdk/components/connectors.test.d.ts +0 -2
- package/dist/sdk/components/connectors.test.d.ts.map +0 -1
- package/dist/sdk/components/edge.d.ts +0 -4
- package/dist/sdk/components/edge.d.ts.map +0 -1
- package/dist/sdk/components/error-boundary.d.ts +0 -23
- package/dist/sdk/components/error-boundary.d.ts.map +0 -1
- package/dist/sdk/components/graph-theme.d.ts +0 -17
- package/dist/sdk/components/graph-theme.d.ts.map +0 -1
- package/dist/sdk/components/header.d.ts +0 -3
- package/dist/sdk/components/header.d.ts.map +0 -1
- package/dist/sdk/components/hooks.d.ts +0 -15
- package/dist/sdk/components/hooks.d.ts.map +0 -1
- package/dist/sdk/components/layout.d.ts +0 -27
- package/dist/sdk/components/layout.d.ts.map +0 -1
- package/dist/sdk/components/layout.test.d.ts +0 -2
- package/dist/sdk/components/layout.test.d.ts.map +0 -1
- package/dist/sdk/components/node-card.d.ts +0 -10
- package/dist/sdk/components/node-card.d.ts.map +0 -1
- package/dist/sdk/components/orchestrator-panel-contexts.d.ts +0 -16
- package/dist/sdk/components/orchestrator-panel-contexts.d.ts.map +0 -1
- package/dist/sdk/components/orchestrator-panel-store.d.ts +0 -46
- package/dist/sdk/components/orchestrator-panel-store.d.ts.map +0 -1
- package/dist/sdk/components/orchestrator-panel-store.test.d.ts +0 -2
- package/dist/sdk/components/orchestrator-panel-store.test.d.ts.map +0 -1
- package/dist/sdk/components/orchestrator-panel-types.d.ts +0 -18
- package/dist/sdk/components/orchestrator-panel-types.d.ts.map +0 -1
- package/dist/sdk/components/orchestrator-panel.d.ts +0 -52
- package/dist/sdk/components/orchestrator-panel.d.ts.map +0 -1
- package/dist/sdk/components/session-graph-panel.d.ts +0 -7
- package/dist/sdk/components/session-graph-panel.d.ts.map +0 -1
- package/dist/sdk/components/status-helpers.d.ts +0 -6
- package/dist/sdk/components/status-helpers.d.ts.map +0 -1
- package/dist/sdk/components/statusline.d.ts +0 -7
- package/dist/sdk/components/statusline.d.ts.map +0 -1
- package/dist/sdk/components/workflow-picker-panel.d.ts +0 -123
- package/dist/sdk/components/workflow-picker-panel.d.ts.map +0 -1
- package/dist/sdk/define-workflow.d.ts +0 -78
- package/dist/sdk/define-workflow.d.ts.map +0 -1
- package/dist/sdk/define-workflow.test.d.ts +0 -2
- package/dist/sdk/define-workflow.test.d.ts.map +0 -1
- package/dist/sdk/errors.d.ts +0 -24
- package/dist/sdk/errors.d.ts.map +0 -1
- package/dist/sdk/errors.test.d.ts +0 -2
- package/dist/sdk/errors.test.d.ts.map +0 -1
- package/dist/sdk/index.d.ts +0 -13
- package/dist/sdk/index.d.ts.map +0 -1
- package/dist/sdk/providers/claude.d.ts +0 -170
- package/dist/sdk/providers/claude.d.ts.map +0 -1
- package/dist/sdk/providers/copilot.d.ts +0 -11
- package/dist/sdk/providers/copilot.d.ts.map +0 -1
- package/dist/sdk/providers/opencode.d.ts +0 -11
- package/dist/sdk/providers/opencode.d.ts.map +0 -1
- package/dist/sdk/runtime/discovery.d.ts +0 -86
- package/dist/sdk/runtime/discovery.d.ts.map +0 -1
- package/dist/sdk/runtime/executor-entry.d.ts +0 -11
- package/dist/sdk/runtime/executor-entry.d.ts.map +0 -1
- package/dist/sdk/runtime/executor.d.ts +0 -72
- package/dist/sdk/runtime/executor.d.ts.map +0 -1
- package/dist/sdk/runtime/executor.test.d.ts +0 -2
- package/dist/sdk/runtime/executor.test.d.ts.map +0 -1
- package/dist/sdk/runtime/graph-inference.d.ts +0 -35
- package/dist/sdk/runtime/graph-inference.d.ts.map +0 -1
- package/dist/sdk/runtime/loader.d.ts +0 -70
- package/dist/sdk/runtime/loader.d.ts.map +0 -1
- package/dist/sdk/runtime/panel.d.ts +0 -9
- package/dist/sdk/runtime/panel.d.ts.map +0 -1
- package/dist/sdk/runtime/theme.d.ts +0 -28
- package/dist/sdk/runtime/theme.d.ts.map +0 -1
- package/dist/sdk/runtime/tmux.d.ts +0 -297
- package/dist/sdk/runtime/tmux.d.ts.map +0 -1
- package/dist/sdk/types.d.ts +0 -295
- package/dist/sdk/types.d.ts.map +0 -1
- package/dist/sdk/workflows/builtin/deep-research-codebase/claude/index.d.ts +0 -62
- package/dist/sdk/workflows/builtin/deep-research-codebase/claude/index.d.ts.map +0 -1
- package/dist/sdk/workflows/builtin/deep-research-codebase/copilot/index.d.ts +0 -46
- package/dist/sdk/workflows/builtin/deep-research-codebase/copilot/index.d.ts.map +0 -1
- package/dist/sdk/workflows/builtin/deep-research-codebase/helpers/heuristic.d.ts +0 -26
- package/dist/sdk/workflows/builtin/deep-research-codebase/helpers/heuristic.d.ts.map +0 -1
- package/dist/sdk/workflows/builtin/deep-research-codebase/helpers/prompts.d.ts +0 -92
- package/dist/sdk/workflows/builtin/deep-research-codebase/helpers/prompts.d.ts.map +0 -1
- package/dist/sdk/workflows/builtin/deep-research-codebase/helpers/scout.d.ts +0 -57
- package/dist/sdk/workflows/builtin/deep-research-codebase/helpers/scout.d.ts.map +0 -1
- package/dist/sdk/workflows/builtin/deep-research-codebase/opencode/index.d.ts +0 -49
- package/dist/sdk/workflows/builtin/deep-research-codebase/opencode/index.d.ts.map +0 -1
- package/dist/sdk/workflows/builtin/ralph/claude/index.d.ts +0 -14
- package/dist/sdk/workflows/builtin/ralph/claude/index.d.ts.map +0 -1
- package/dist/sdk/workflows/builtin/ralph/copilot/index.d.ts +0 -14
- package/dist/sdk/workflows/builtin/ralph/copilot/index.d.ts.map +0 -1
- package/dist/sdk/workflows/builtin/ralph/helpers/git.d.ts +0 -17
- package/dist/sdk/workflows/builtin/ralph/helpers/git.d.ts.map +0 -1
- package/dist/sdk/workflows/builtin/ralph/helpers/prompts.d.ts +0 -119
- package/dist/sdk/workflows/builtin/ralph/helpers/prompts.d.ts.map +0 -1
- package/dist/sdk/workflows/builtin/ralph/helpers/review.d.ts +0 -20
- package/dist/sdk/workflows/builtin/ralph/helpers/review.d.ts.map +0 -1
- package/dist/sdk/workflows/builtin/ralph/opencode/index.d.ts +0 -14
- package/dist/sdk/workflows/builtin/ralph/opencode/index.d.ts.map +0 -1
- package/dist/sdk/workflows/index.d.ts +0 -24
- package/dist/sdk/workflows/index.d.ts.map +0 -1
- package/dist/services/config/definitions.d.ts +0 -85
- package/dist/services/config/definitions.d.ts.map +0 -1
- package/dist/services/system/copy.d.ts +0 -77
- package/dist/services/system/copy.d.ts.map +0 -1
- package/dist/services/system/detect.d.ts +0 -75
- package/dist/services/system/detect.d.ts.map +0 -1
- package/tsconfig.json +0 -33
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import os
|
|
2
|
+
import sys
|
|
3
|
+
|
|
4
|
+
from pdf2image import convert_from_path
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
def convert(pdf_path, output_dir, max_dim=1000):
|
|
10
|
+
images = convert_from_path(pdf_path, dpi=200)
|
|
11
|
+
|
|
12
|
+
for i, image in enumerate(images):
|
|
13
|
+
width, height = image.size
|
|
14
|
+
if width > max_dim or height > max_dim:
|
|
15
|
+
scale_factor = min(max_dim / width, max_dim / height)
|
|
16
|
+
new_width = int(width * scale_factor)
|
|
17
|
+
new_height = int(height * scale_factor)
|
|
18
|
+
image = image.resize((new_width, new_height))
|
|
19
|
+
|
|
20
|
+
image_path = os.path.join(output_dir, f"page_{i+1}.png")
|
|
21
|
+
image.save(image_path)
|
|
22
|
+
print(f"Saved page {i+1} as {image_path} (size: {image.size})")
|
|
23
|
+
|
|
24
|
+
print(f"Converted {len(images)} pages to PNG images")
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
if __name__ == "__main__":
|
|
28
|
+
if len(sys.argv) != 3:
|
|
29
|
+
print("Usage: convert_pdf_to_images.py [input pdf] [output directory]")
|
|
30
|
+
sys.exit(1)
|
|
31
|
+
pdf_path = sys.argv[1]
|
|
32
|
+
output_directory = sys.argv[2]
|
|
33
|
+
convert(pdf_path, output_directory)
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import json
|
|
2
|
+
import sys
|
|
3
|
+
|
|
4
|
+
from PIL import Image, ImageDraw
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
def create_validation_image(page_number, fields_json_path, input_path, output_path):
|
|
10
|
+
with open(fields_json_path, 'r') as f:
|
|
11
|
+
data = json.load(f)
|
|
12
|
+
|
|
13
|
+
img = Image.open(input_path)
|
|
14
|
+
draw = ImageDraw.Draw(img)
|
|
15
|
+
num_boxes = 0
|
|
16
|
+
|
|
17
|
+
for field in data["form_fields"]:
|
|
18
|
+
if field["page_number"] == page_number:
|
|
19
|
+
entry_box = field['entry_bounding_box']
|
|
20
|
+
label_box = field['label_bounding_box']
|
|
21
|
+
draw.rectangle(entry_box, outline='red', width=2)
|
|
22
|
+
draw.rectangle(label_box, outline='blue', width=2)
|
|
23
|
+
num_boxes += 2
|
|
24
|
+
|
|
25
|
+
img.save(output_path)
|
|
26
|
+
print(f"Created validation image at {output_path} with {num_boxes} bounding boxes")
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
if __name__ == "__main__":
|
|
30
|
+
if len(sys.argv) != 5:
|
|
31
|
+
print("Usage: create_validation_image.py [page number] [fields.json file] [input image path] [output image path]")
|
|
32
|
+
sys.exit(1)
|
|
33
|
+
page_number = int(sys.argv[1])
|
|
34
|
+
fields_json_path = sys.argv[2]
|
|
35
|
+
input_image_path = sys.argv[3]
|
|
36
|
+
output_image_path = sys.argv[4]
|
|
37
|
+
create_validation_image(page_number, fields_json_path, input_image_path, output_image_path)
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import json
|
|
2
|
+
import sys
|
|
3
|
+
|
|
4
|
+
from pypdf import PdfReader
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
def get_full_annotation_field_id(annotation):
|
|
10
|
+
components = []
|
|
11
|
+
while annotation:
|
|
12
|
+
field_name = annotation.get('/T')
|
|
13
|
+
if field_name:
|
|
14
|
+
components.append(field_name)
|
|
15
|
+
annotation = annotation.get('/Parent')
|
|
16
|
+
return ".".join(reversed(components)) if components else None
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def make_field_dict(field, field_id):
|
|
20
|
+
field_dict = {"field_id": field_id}
|
|
21
|
+
ft = field.get('/FT')
|
|
22
|
+
if ft == "/Tx":
|
|
23
|
+
field_dict["type"] = "text"
|
|
24
|
+
elif ft == "/Btn":
|
|
25
|
+
field_dict["type"] = "checkbox"
|
|
26
|
+
states = field.get("/_States_", [])
|
|
27
|
+
if len(states) == 2:
|
|
28
|
+
if "/Off" in states:
|
|
29
|
+
field_dict["checked_value"] = states[0] if states[0] != "/Off" else states[1]
|
|
30
|
+
field_dict["unchecked_value"] = "/Off"
|
|
31
|
+
else:
|
|
32
|
+
print(f"Unexpected state values for checkbox `${field_id}`. Its checked and unchecked values may not be correct; if you're trying to check it, visually verify the results.")
|
|
33
|
+
field_dict["checked_value"] = states[0]
|
|
34
|
+
field_dict["unchecked_value"] = states[1]
|
|
35
|
+
elif ft == "/Ch":
|
|
36
|
+
field_dict["type"] = "choice"
|
|
37
|
+
states = field.get("/_States_", [])
|
|
38
|
+
field_dict["choice_options"] = [{
|
|
39
|
+
"value": state[0],
|
|
40
|
+
"text": state[1],
|
|
41
|
+
} for state in states]
|
|
42
|
+
else:
|
|
43
|
+
field_dict["type"] = f"unknown ({ft})"
|
|
44
|
+
return field_dict
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
def get_field_info(reader: PdfReader):
|
|
48
|
+
fields = reader.get_fields()
|
|
49
|
+
|
|
50
|
+
field_info_by_id = {}
|
|
51
|
+
possible_radio_names = set()
|
|
52
|
+
|
|
53
|
+
for field_id, field in fields.items():
|
|
54
|
+
if field.get("/Kids"):
|
|
55
|
+
if field.get("/FT") == "/Btn":
|
|
56
|
+
possible_radio_names.add(field_id)
|
|
57
|
+
continue
|
|
58
|
+
field_info_by_id[field_id] = make_field_dict(field, field_id)
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
radio_fields_by_id = {}
|
|
62
|
+
|
|
63
|
+
for page_index, page in enumerate(reader.pages):
|
|
64
|
+
annotations = page.get('/Annots', [])
|
|
65
|
+
for ann in annotations:
|
|
66
|
+
field_id = get_full_annotation_field_id(ann)
|
|
67
|
+
if field_id in field_info_by_id:
|
|
68
|
+
field_info_by_id[field_id]["page"] = page_index + 1
|
|
69
|
+
field_info_by_id[field_id]["rect"] = ann.get('/Rect')
|
|
70
|
+
elif field_id in possible_radio_names:
|
|
71
|
+
try:
|
|
72
|
+
on_values = [v for v in ann["/AP"]["/N"] if v != "/Off"]
|
|
73
|
+
except KeyError:
|
|
74
|
+
continue
|
|
75
|
+
if len(on_values) == 1:
|
|
76
|
+
rect = ann.get("/Rect")
|
|
77
|
+
if field_id not in radio_fields_by_id:
|
|
78
|
+
radio_fields_by_id[field_id] = {
|
|
79
|
+
"field_id": field_id,
|
|
80
|
+
"type": "radio_group",
|
|
81
|
+
"page": page_index + 1,
|
|
82
|
+
"radio_options": [],
|
|
83
|
+
}
|
|
84
|
+
radio_fields_by_id[field_id]["radio_options"].append({
|
|
85
|
+
"value": on_values[0],
|
|
86
|
+
"rect": rect,
|
|
87
|
+
})
|
|
88
|
+
|
|
89
|
+
fields_with_location = []
|
|
90
|
+
for field_info in field_info_by_id.values():
|
|
91
|
+
if "page" in field_info:
|
|
92
|
+
fields_with_location.append(field_info)
|
|
93
|
+
else:
|
|
94
|
+
print(f"Unable to determine location for field id: {field_info.get('field_id')}, ignoring")
|
|
95
|
+
|
|
96
|
+
def sort_key(f):
|
|
97
|
+
if "radio_options" in f:
|
|
98
|
+
rect = f["radio_options"][0]["rect"] or [0, 0, 0, 0]
|
|
99
|
+
else:
|
|
100
|
+
rect = f.get("rect") or [0, 0, 0, 0]
|
|
101
|
+
adjusted_position = [-rect[1], rect[0]]
|
|
102
|
+
return [f.get("page"), adjusted_position]
|
|
103
|
+
|
|
104
|
+
sorted_fields = fields_with_location + list(radio_fields_by_id.values())
|
|
105
|
+
sorted_fields.sort(key=sort_key)
|
|
106
|
+
|
|
107
|
+
return sorted_fields
|
|
108
|
+
|
|
109
|
+
|
|
110
|
+
def write_field_info(pdf_path: str, json_output_path: str):
|
|
111
|
+
reader = PdfReader(pdf_path)
|
|
112
|
+
field_info = get_field_info(reader)
|
|
113
|
+
with open(json_output_path, "w") as f:
|
|
114
|
+
json.dump(field_info, f, indent=2)
|
|
115
|
+
print(f"Wrote {len(field_info)} fields to {json_output_path}")
|
|
116
|
+
|
|
117
|
+
|
|
118
|
+
if __name__ == "__main__":
|
|
119
|
+
if len(sys.argv) != 3:
|
|
120
|
+
print("Usage: extract_form_field_info.py [input pdf] [output json]")
|
|
121
|
+
sys.exit(1)
|
|
122
|
+
write_field_info(sys.argv[1], sys.argv[2])
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Extract form structure from a non-fillable PDF.
|
|
3
|
+
|
|
4
|
+
This script analyzes the PDF to find:
|
|
5
|
+
- Text labels with their exact coordinates
|
|
6
|
+
- Horizontal lines (row boundaries)
|
|
7
|
+
- Checkboxes (small rectangles)
|
|
8
|
+
|
|
9
|
+
Output: A JSON file with the form structure that can be used to generate
|
|
10
|
+
accurate field coordinates for filling.
|
|
11
|
+
|
|
12
|
+
Usage: python extract_form_structure.py <input.pdf> <output.json>
|
|
13
|
+
"""
|
|
14
|
+
|
|
15
|
+
import json
|
|
16
|
+
import sys
|
|
17
|
+
import pdfplumber
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
def extract_form_structure(pdf_path):
|
|
21
|
+
structure = {
|
|
22
|
+
"pages": [],
|
|
23
|
+
"labels": [],
|
|
24
|
+
"lines": [],
|
|
25
|
+
"checkboxes": [],
|
|
26
|
+
"row_boundaries": []
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
with pdfplumber.open(pdf_path) as pdf:
|
|
30
|
+
for page_num, page in enumerate(pdf.pages, 1):
|
|
31
|
+
structure["pages"].append({
|
|
32
|
+
"page_number": page_num,
|
|
33
|
+
"width": float(page.width),
|
|
34
|
+
"height": float(page.height)
|
|
35
|
+
})
|
|
36
|
+
|
|
37
|
+
words = page.extract_words()
|
|
38
|
+
for word in words:
|
|
39
|
+
structure["labels"].append({
|
|
40
|
+
"page": page_num,
|
|
41
|
+
"text": word["text"],
|
|
42
|
+
"x0": round(float(word["x0"]), 1),
|
|
43
|
+
"top": round(float(word["top"]), 1),
|
|
44
|
+
"x1": round(float(word["x1"]), 1),
|
|
45
|
+
"bottom": round(float(word["bottom"]), 1)
|
|
46
|
+
})
|
|
47
|
+
|
|
48
|
+
for line in page.lines:
|
|
49
|
+
if abs(float(line["x1"]) - float(line["x0"])) > page.width * 0.5:
|
|
50
|
+
structure["lines"].append({
|
|
51
|
+
"page": page_num,
|
|
52
|
+
"y": round(float(line["top"]), 1),
|
|
53
|
+
"x0": round(float(line["x0"]), 1),
|
|
54
|
+
"x1": round(float(line["x1"]), 1)
|
|
55
|
+
})
|
|
56
|
+
|
|
57
|
+
for rect in page.rects:
|
|
58
|
+
width = float(rect["x1"]) - float(rect["x0"])
|
|
59
|
+
height = float(rect["bottom"]) - float(rect["top"])
|
|
60
|
+
if 5 <= width <= 15 and 5 <= height <= 15 and abs(width - height) < 2:
|
|
61
|
+
structure["checkboxes"].append({
|
|
62
|
+
"page": page_num,
|
|
63
|
+
"x0": round(float(rect["x0"]), 1),
|
|
64
|
+
"top": round(float(rect["top"]), 1),
|
|
65
|
+
"x1": round(float(rect["x1"]), 1),
|
|
66
|
+
"bottom": round(float(rect["bottom"]), 1),
|
|
67
|
+
"center_x": round((float(rect["x0"]) + float(rect["x1"])) / 2, 1),
|
|
68
|
+
"center_y": round((float(rect["top"]) + float(rect["bottom"])) / 2, 1)
|
|
69
|
+
})
|
|
70
|
+
|
|
71
|
+
lines_by_page = {}
|
|
72
|
+
for line in structure["lines"]:
|
|
73
|
+
page = line["page"]
|
|
74
|
+
if page not in lines_by_page:
|
|
75
|
+
lines_by_page[page] = []
|
|
76
|
+
lines_by_page[page].append(line["y"])
|
|
77
|
+
|
|
78
|
+
for page, y_coords in lines_by_page.items():
|
|
79
|
+
y_coords = sorted(set(y_coords))
|
|
80
|
+
for i in range(len(y_coords) - 1):
|
|
81
|
+
structure["row_boundaries"].append({
|
|
82
|
+
"page": page,
|
|
83
|
+
"row_top": y_coords[i],
|
|
84
|
+
"row_bottom": y_coords[i + 1],
|
|
85
|
+
"row_height": round(y_coords[i + 1] - y_coords[i], 1)
|
|
86
|
+
})
|
|
87
|
+
|
|
88
|
+
return structure
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
def main():
|
|
92
|
+
if len(sys.argv) != 3:
|
|
93
|
+
print("Usage: extract_form_structure.py <input.pdf> <output.json>")
|
|
94
|
+
sys.exit(1)
|
|
95
|
+
|
|
96
|
+
pdf_path = sys.argv[1]
|
|
97
|
+
output_path = sys.argv[2]
|
|
98
|
+
|
|
99
|
+
print(f"Extracting structure from {pdf_path}...")
|
|
100
|
+
structure = extract_form_structure(pdf_path)
|
|
101
|
+
|
|
102
|
+
with open(output_path, "w") as f:
|
|
103
|
+
json.dump(structure, f, indent=2)
|
|
104
|
+
|
|
105
|
+
print(f"Found:")
|
|
106
|
+
print(f" - {len(structure['pages'])} pages")
|
|
107
|
+
print(f" - {len(structure['labels'])} text labels")
|
|
108
|
+
print(f" - {len(structure['lines'])} horizontal lines")
|
|
109
|
+
print(f" - {len(structure['checkboxes'])} checkboxes")
|
|
110
|
+
print(f" - {len(structure['row_boundaries'])} row boundaries")
|
|
111
|
+
print(f"Saved to {output_path}")
|
|
112
|
+
|
|
113
|
+
|
|
114
|
+
if __name__ == "__main__":
|
|
115
|
+
main()
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import json
|
|
2
|
+
import sys
|
|
3
|
+
|
|
4
|
+
from pypdf import PdfReader, PdfWriter
|
|
5
|
+
|
|
6
|
+
from extract_form_field_info import get_field_info
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
def fill_pdf_fields(input_pdf_path: str, fields_json_path: str, output_pdf_path: str):
|
|
12
|
+
with open(fields_json_path) as f:
|
|
13
|
+
fields = json.load(f)
|
|
14
|
+
fields_by_page = {}
|
|
15
|
+
for field in fields:
|
|
16
|
+
if "value" in field:
|
|
17
|
+
field_id = field["field_id"]
|
|
18
|
+
page = field["page"]
|
|
19
|
+
if page not in fields_by_page:
|
|
20
|
+
fields_by_page[page] = {}
|
|
21
|
+
fields_by_page[page][field_id] = field["value"]
|
|
22
|
+
|
|
23
|
+
reader = PdfReader(input_pdf_path)
|
|
24
|
+
|
|
25
|
+
has_error = False
|
|
26
|
+
field_info = get_field_info(reader)
|
|
27
|
+
fields_by_ids = {f["field_id"]: f for f in field_info}
|
|
28
|
+
for field in fields:
|
|
29
|
+
existing_field = fields_by_ids.get(field["field_id"])
|
|
30
|
+
if not existing_field:
|
|
31
|
+
has_error = True
|
|
32
|
+
print(f"ERROR: `{field['field_id']}` is not a valid field ID")
|
|
33
|
+
elif field["page"] != existing_field["page"]:
|
|
34
|
+
has_error = True
|
|
35
|
+
print(f"ERROR: Incorrect page number for `{field['field_id']}` (got {field['page']}, expected {existing_field['page']})")
|
|
36
|
+
else:
|
|
37
|
+
if "value" in field:
|
|
38
|
+
err = validation_error_for_field_value(existing_field, field["value"])
|
|
39
|
+
if err:
|
|
40
|
+
print(err)
|
|
41
|
+
has_error = True
|
|
42
|
+
if has_error:
|
|
43
|
+
sys.exit(1)
|
|
44
|
+
|
|
45
|
+
writer = PdfWriter(clone_from=reader)
|
|
46
|
+
for page, field_values in fields_by_page.items():
|
|
47
|
+
writer.update_page_form_field_values(writer.pages[page - 1], field_values, auto_regenerate=False)
|
|
48
|
+
|
|
49
|
+
writer.set_need_appearances_writer(True)
|
|
50
|
+
|
|
51
|
+
with open(output_pdf_path, "wb") as f:
|
|
52
|
+
writer.write(f)
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
def validation_error_for_field_value(field_info, field_value):
|
|
56
|
+
field_type = field_info["type"]
|
|
57
|
+
field_id = field_info["field_id"]
|
|
58
|
+
if field_type == "checkbox":
|
|
59
|
+
checked_val = field_info["checked_value"]
|
|
60
|
+
unchecked_val = field_info["unchecked_value"]
|
|
61
|
+
if field_value != checked_val and field_value != unchecked_val:
|
|
62
|
+
return f'ERROR: Invalid value "{field_value}" for checkbox field "{field_id}". The checked value is "{checked_val}" and the unchecked value is "{unchecked_val}"'
|
|
63
|
+
elif field_type == "radio_group":
|
|
64
|
+
option_values = [opt["value"] for opt in field_info["radio_options"]]
|
|
65
|
+
if field_value not in option_values:
|
|
66
|
+
return f'ERROR: Invalid value "{field_value}" for radio group field "{field_id}". Valid values are: {option_values}'
|
|
67
|
+
elif field_type == "choice":
|
|
68
|
+
choice_values = [opt["value"] for opt in field_info["choice_options"]]
|
|
69
|
+
if field_value not in choice_values:
|
|
70
|
+
return f'ERROR: Invalid value "{field_value}" for choice field "{field_id}". Valid values are: {choice_values}'
|
|
71
|
+
return None
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
def monkeypatch_pydpf_method():
|
|
75
|
+
from pypdf.generic import DictionaryObject
|
|
76
|
+
from pypdf.constants import FieldDictionaryAttributes
|
|
77
|
+
|
|
78
|
+
original_get_inherited = DictionaryObject.get_inherited
|
|
79
|
+
|
|
80
|
+
def patched_get_inherited(self, key: str, default = None):
|
|
81
|
+
result = original_get_inherited(self, key, default)
|
|
82
|
+
if key == FieldDictionaryAttributes.Opt:
|
|
83
|
+
if isinstance(result, list) and all(isinstance(v, list) and len(v) == 2 for v in result):
|
|
84
|
+
result = [r[0] for r in result]
|
|
85
|
+
return result
|
|
86
|
+
|
|
87
|
+
DictionaryObject.get_inherited = patched_get_inherited
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
if __name__ == "__main__":
|
|
91
|
+
if len(sys.argv) != 4:
|
|
92
|
+
print("Usage: fill_fillable_fields.py [input pdf] [field_values.json] [output pdf]")
|
|
93
|
+
sys.exit(1)
|
|
94
|
+
monkeypatch_pydpf_method()
|
|
95
|
+
input_pdf = sys.argv[1]
|
|
96
|
+
fields_json = sys.argv[2]
|
|
97
|
+
output_pdf = sys.argv[3]
|
|
98
|
+
fill_pdf_fields(input_pdf, fields_json, output_pdf)
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import json
|
|
2
|
+
import sys
|
|
3
|
+
|
|
4
|
+
from pypdf import PdfReader, PdfWriter
|
|
5
|
+
from pypdf.annotations import FreeText
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
def transform_from_image_coords(bbox, image_width, image_height, pdf_width, pdf_height):
|
|
11
|
+
x_scale = pdf_width / image_width
|
|
12
|
+
y_scale = pdf_height / image_height
|
|
13
|
+
|
|
14
|
+
left = bbox[0] * x_scale
|
|
15
|
+
right = bbox[2] * x_scale
|
|
16
|
+
|
|
17
|
+
top = pdf_height - (bbox[1] * y_scale)
|
|
18
|
+
bottom = pdf_height - (bbox[3] * y_scale)
|
|
19
|
+
|
|
20
|
+
return left, bottom, right, top
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
def transform_from_pdf_coords(bbox, pdf_height):
|
|
24
|
+
left = bbox[0]
|
|
25
|
+
right = bbox[2]
|
|
26
|
+
|
|
27
|
+
pypdf_top = pdf_height - bbox[1]
|
|
28
|
+
pypdf_bottom = pdf_height - bbox[3]
|
|
29
|
+
|
|
30
|
+
return left, pypdf_bottom, right, pypdf_top
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
def fill_pdf_form(input_pdf_path, fields_json_path, output_pdf_path):
|
|
34
|
+
|
|
35
|
+
with open(fields_json_path, "r") as f:
|
|
36
|
+
fields_data = json.load(f)
|
|
37
|
+
|
|
38
|
+
reader = PdfReader(input_pdf_path)
|
|
39
|
+
writer = PdfWriter()
|
|
40
|
+
|
|
41
|
+
writer.append(reader)
|
|
42
|
+
|
|
43
|
+
pdf_dimensions = {}
|
|
44
|
+
for i, page in enumerate(reader.pages):
|
|
45
|
+
mediabox = page.mediabox
|
|
46
|
+
pdf_dimensions[i + 1] = [mediabox.width, mediabox.height]
|
|
47
|
+
|
|
48
|
+
annotations = []
|
|
49
|
+
for field in fields_data["form_fields"]:
|
|
50
|
+
page_num = field["page_number"]
|
|
51
|
+
|
|
52
|
+
page_info = next(p for p in fields_data["pages"] if p["page_number"] == page_num)
|
|
53
|
+
pdf_width, pdf_height = pdf_dimensions[page_num]
|
|
54
|
+
|
|
55
|
+
if "pdf_width" in page_info:
|
|
56
|
+
transformed_entry_box = transform_from_pdf_coords(
|
|
57
|
+
field["entry_bounding_box"],
|
|
58
|
+
float(pdf_height)
|
|
59
|
+
)
|
|
60
|
+
else:
|
|
61
|
+
image_width = page_info["image_width"]
|
|
62
|
+
image_height = page_info["image_height"]
|
|
63
|
+
transformed_entry_box = transform_from_image_coords(
|
|
64
|
+
field["entry_bounding_box"],
|
|
65
|
+
image_width, image_height,
|
|
66
|
+
float(pdf_width), float(pdf_height)
|
|
67
|
+
)
|
|
68
|
+
|
|
69
|
+
if "entry_text" not in field or "text" not in field["entry_text"]:
|
|
70
|
+
continue
|
|
71
|
+
entry_text = field["entry_text"]
|
|
72
|
+
text = entry_text["text"]
|
|
73
|
+
if not text:
|
|
74
|
+
continue
|
|
75
|
+
|
|
76
|
+
font_name = entry_text.get("font", "Arial")
|
|
77
|
+
font_size = str(entry_text.get("font_size", 14)) + "pt"
|
|
78
|
+
font_color = entry_text.get("font_color", "000000")
|
|
79
|
+
|
|
80
|
+
annotation = FreeText(
|
|
81
|
+
text=text,
|
|
82
|
+
rect=transformed_entry_box,
|
|
83
|
+
font=font_name,
|
|
84
|
+
font_size=font_size,
|
|
85
|
+
font_color=font_color,
|
|
86
|
+
border_color=None,
|
|
87
|
+
background_color=None,
|
|
88
|
+
)
|
|
89
|
+
annotations.append(annotation)
|
|
90
|
+
writer.add_annotation(page_number=page_num - 1, annotation=annotation)
|
|
91
|
+
|
|
92
|
+
with open(output_pdf_path, "wb") as output:
|
|
93
|
+
writer.write(output)
|
|
94
|
+
|
|
95
|
+
print(f"Successfully filled PDF form and saved to {output_pdf_path}")
|
|
96
|
+
print(f"Added {len(annotations)} text annotations")
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
if __name__ == "__main__":
|
|
100
|
+
if len(sys.argv) != 4:
|
|
101
|
+
print("Usage: fill_pdf_form_with_annotations.py [input pdf] [fields.json] [output pdf]")
|
|
102
|
+
sys.exit(1)
|
|
103
|
+
input_pdf = sys.argv[1]
|
|
104
|
+
fields_json = sys.argv[2]
|
|
105
|
+
output_pdf = sys.argv[3]
|
|
106
|
+
|
|
107
|
+
fill_pdf_form(input_pdf, fields_json, output_pdf)
|