skillware 0.5.7__tar.gz → 0.5.8__tar.gz
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.
- {skillware-0.5.7/skillware.egg-info → skillware-0.5.8}/PKG-INFO +20 -9
- {skillware-0.5.7 → skillware-0.5.8}/README.md +8 -8
- {skillware-0.5.7 → skillware-0.5.8}/pyproject.toml +50 -2
- {skillware-0.5.7 → skillware-0.5.8}/skills/compliance/mica_module/card.json +4 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/compliance/mica_module/instructions.md +2 -1
- {skillware-0.5.7 → skillware-0.5.8}/skills/compliance/mica_module/manifest.yaml +2 -1
- {skillware-0.5.7 → skillware-0.5.8}/skills/compliance/mica_module/skill.py +5 -1
- {skillware-0.5.7 → skillware-0.5.8}/skills/compliance/mica_module/test_skill.py +4 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/compliance/pii_masker/skill.py +2 -1
- {skillware-0.5.7 → skillware-0.5.8}/skills/data_engineering/novelty_extractor/skill.py +2 -8
- {skillware-0.5.7 → skillware-0.5.8}/skills/defi/token_security_scanner/test_skill.py +2 -1
- {skillware-0.5.7 → skillware-0.5.8}/skills/office/pdf_form_filler/manifest.yaml +1 -1
- {skillware-0.5.7 → skillware-0.5.8}/skills/office/pdf_form_filler/skill.py +29 -9
- skillware-0.5.8/skills/office/pdf_form_filler/test_skill.py +167 -0
- skillware-0.5.8/skills/office/web_form_mapper/__init__.py +1 -0
- skillware-0.5.8/skills/office/web_form_mapper/card.json +29 -0
- skillware-0.5.8/skills/office/web_form_mapper/dom_parser.py +228 -0
- skillware-0.5.8/skills/office/web_form_mapper/instructions.md +51 -0
- skillware-0.5.8/skills/office/web_form_mapper/kb/form_profiles/delaware_corp_filing.yaml +12 -0
- skillware-0.5.8/skills/office/web_form_mapper/kb/form_profiles/irs_portal.yaml +14 -0
- skillware-0.5.8/skills/office/web_form_mapper/manifest.yaml +131 -0
- skillware-0.5.8/skills/office/web_form_mapper/matcher.py +430 -0
- skillware-0.5.8/skills/office/web_form_mapper/models.py +85 -0
- skillware-0.5.8/skills/office/web_form_mapper/skill.py +421 -0
- skillware-0.5.8/skills/office/web_form_mapper/submitter.py +246 -0
- skillware-0.5.8/skills/office/web_form_mapper/test_skill.py +328 -0
- skillware-0.5.8/skills/office/web_form_mapper/tests/fixtures/aspnet_legacy_form.html +58 -0
- skillware-0.5.8/skills/office/web_form_mapper/tests/fixtures/captcha_blocked_form.html +14 -0
- skillware-0.5.8/skills/office/web_form_mapper/tests/fixtures/modern_spa_form.html +30 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/optimization/prompt_rewriter/skill.py +2 -4
- skillware-0.5.8/skills/security/deepfake_guard/__init__.py +5 -0
- skillware-0.5.8/skills/security/deepfake_guard/card.json +50 -0
- skillware-0.5.8/skills/security/deepfake_guard/constants.py +113 -0
- skillware-0.5.8/skills/security/deepfake_guard/document.py +410 -0
- skillware-0.5.8/skills/security/deepfake_guard/forensics.py +397 -0
- skillware-0.5.8/skills/security/deepfake_guard/guard.py +342 -0
- skillware-0.5.8/skills/security/deepfake_guard/instructions.md +54 -0
- skillware-0.5.8/skills/security/deepfake_guard/manifest.yaml +132 -0
- skillware-0.5.8/skills/security/deepfake_guard/provenance.py +139 -0
- skillware-0.5.8/skills/security/deepfake_guard/skill.py +337 -0
- skillware-0.5.8/skills/security/deepfake_guard/test_skill.py +351 -0
- {skillware-0.5.7 → skillware-0.5.8}/skillware/chains.py +193 -0
- {skillware-0.5.7 → skillware-0.5.8}/skillware/cli_os.py +2 -0
- {skillware-0.5.7 → skillware-0.5.8}/skillware/context.py +58 -6
- skillware-0.5.8/skillware/core/base_skill.py +147 -0
- {skillware-0.5.7 → skillware-0.5.8}/skillware/version_policy.py +2 -2
- {skillware-0.5.7 → skillware-0.5.8/skillware.egg-info}/PKG-INFO +20 -9
- {skillware-0.5.7 → skillware-0.5.8}/skillware.egg-info/SOURCES.txt +30 -0
- {skillware-0.5.7 → skillware-0.5.8}/skillware.egg-info/requires.txt +13 -0
- skillware-0.5.8/tests/test_async_concurrency_stress.py +174 -0
- skillware-0.5.8/tests/test_async_execution.py +196 -0
- skillware-0.5.8/tests/test_base_skill.py +99 -0
- skillware-0.5.8/tests/test_chains_async.py +166 -0
- {skillware-0.5.7 → skillware-0.5.8}/tests/test_cli.py +1 -1
- {skillware-0.5.7 → skillware-0.5.8}/tests/test_examples_smoke.py +46 -0
- skillware-0.5.8/tests/test_security_audit.py +142 -0
- {skillware-0.5.7 → skillware-0.5.8}/tests/test_version_policy.py +23 -13
- skillware-0.5.7/skills/office/pdf_form_filler/test_skill.py +0 -86
- skillware-0.5.7/skillware/core/base_skill.py +0 -82
- skillware-0.5.7/tests/test_base_skill.py +0 -30
- {skillware-0.5.7 → skillware-0.5.8}/LICENSE +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/MANIFEST.in +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/setup.cfg +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/__init__.py +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/compliance/__init__.py +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/compliance/mica_module/__init__.py +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/compliance/mica_module/mica_corpus.json +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/compliance/pii_masker/__init__.py +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/compliance/pii_masker/card.json +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/compliance/pii_masker/instructions.md +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/compliance/pii_masker/manifest.yaml +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/compliance/pii_masker/test_skill.py +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/compliance/tos_evaluator/__init__.py +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/compliance/tos_evaluator/card.json +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/compliance/tos_evaluator/instructions.md +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/compliance/tos_evaluator/manifest.yaml +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/compliance/tos_evaluator/skill.py +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/compliance/tos_evaluator/test_skill.py +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/creative/__init__.py +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/creative/bg_remover/__init__.py +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/creative/bg_remover/card.json +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/creative/bg_remover/instructions.md +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/creative/bg_remover/manifest.yaml +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/creative/bg_remover/skill.py +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/creative/bg_remover/test_skill.py +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/creative/deck_builder/__init__.py +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/creative/deck_builder/archetypes.py +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/creative/deck_builder/builder.py +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/creative/deck_builder/card.json +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/creative/deck_builder/instructions.md +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/creative/deck_builder/lint.py +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/creative/deck_builder/manifest.yaml +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/creative/deck_builder/placeholders.py +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/creative/deck_builder/schemas/deck_spec.schema.json +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/creative/deck_builder/skill.py +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/creative/deck_builder/templates/corporate_v1.pptx +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/creative/deck_builder/templates/minimal_v1.pptx +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/creative/deck_builder/templates/pitch_v1.pptx +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/creative/deck_builder/test_skill.py +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/data_engineering/__init__.py +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/data_engineering/novelty_extractor/__init__.py +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/data_engineering/novelty_extractor/card.json +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/data_engineering/novelty_extractor/instructions.md +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/data_engineering/novelty_extractor/manifest.yaml +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/data_engineering/novelty_extractor/test_skill.py +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/data_engineering/semantic_web_proxy/__init__.py +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/data_engineering/semantic_web_proxy/card.json +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/data_engineering/semantic_web_proxy/instructions.md +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/data_engineering/semantic_web_proxy/manifest.yaml +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/data_engineering/semantic_web_proxy/proxy.py +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/data_engineering/semantic_web_proxy/skill.py +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/data_engineering/semantic_web_proxy/test_skill.py +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/data_engineering/synthetic_generator/__init__.py +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/data_engineering/synthetic_generator/card.json +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/data_engineering/synthetic_generator/instructions.md +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/data_engineering/synthetic_generator/manifest.yaml +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/data_engineering/synthetic_generator/skill.py +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/data_engineering/synthetic_generator/test_skill.py +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/defi/__init__.py +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/defi/evm_reader/__init__.py +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/defi/evm_reader/abis.py +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/defi/evm_reader/card.json +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/defi/evm_reader/instructions.md +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/defi/evm_reader/manifest.yaml +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/defi/evm_reader/skill.py +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/defi/evm_reader/test_skill.py +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/defi/evm_tx_handler/__init__.py +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/defi/evm_tx_handler/abis.py +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/defi/evm_tx_handler/card.json +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/defi/evm_tx_handler/config.yaml.example +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/defi/evm_tx_handler/data/addressbook.yaml +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/defi/evm_tx_handler/data/chains.yaml +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/defi/evm_tx_handler/data/tokens.yaml +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/defi/evm_tx_handler/instructions.md +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/defi/evm_tx_handler/manifest.yaml +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/defi/evm_tx_handler/skill.py +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/defi/evm_tx_handler/test_skill.py +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/defi/token_security_scanner/__init__.py +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/defi/token_security_scanner/card.json +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/defi/token_security_scanner/fixtures/goplus_clean_base.json +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/defi/token_security_scanner/fixtures/goplus_closed_source_unknown.json +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/defi/token_security_scanner/fixtures/goplus_honeypot.json +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/defi/token_security_scanner/fixtures/goplus_medium.json +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/defi/token_security_scanner/instructions.md +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/defi/token_security_scanner/manifest.yaml +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/defi/token_security_scanner/skill.py +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/dev_tools/__init__.py +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/dev_tools/issue_resolver/__init__.py +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/dev_tools/issue_resolver/card.json +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/dev_tools/issue_resolver/instructions.md +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/dev_tools/issue_resolver/manifest.yaml +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/dev_tools/issue_resolver/skill.py +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/dev_tools/issue_resolver/test_skill.py +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/dev_tools/issue_resolver/workflow.py +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/finance/__init__.py +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/finance/uk_companies_house_handler/__init__.py +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/finance/uk_companies_house_handler/card.json +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/finance/uk_companies_house_handler/data/api_index.json +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/finance/uk_companies_house_handler/data/terminology_map.yaml +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/finance/uk_companies_house_handler/instructions.md +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/finance/uk_companies_house_handler/manifest.yaml +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/finance/uk_companies_house_handler/skill.py +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/finance/uk_companies_house_handler/test_skill.py +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/finance/wallet_screening/__init__.py +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/finance/wallet_screening/card.json +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/finance/wallet_screening/data/entities.ftm.json +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/finance/wallet_screening/data/malicious_scs_2025.json +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/finance/wallet_screening/data/normalized_fbi_lazarus_20250722_180019.json +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/finance/wallet_screening/data/normalized_israel_nbctf_20250722_180019.json +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/finance/wallet_screening/data/normalized_uniswap_trm.json +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/finance/wallet_screening/instructions.md +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/finance/wallet_screening/maintenance/normalization_tool.py +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/finance/wallet_screening/maintenance/normalize_uniswap_trm.py +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/finance/wallet_screening/manifest.yaml +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/finance/wallet_screening/skill.py +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/finance/wallet_screening/test_skill.py +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/linguistics/__init__.py +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/linguistics/korean_slang/__init__.py +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/linguistics/korean_slang/card.json +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/linguistics/korean_slang/instructions.md +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/linguistics/korean_slang/kb/constitution.json +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/linguistics/korean_slang/kb/entries.json +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/linguistics/korean_slang/kb/generation.json +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/linguistics/korean_slang/kb/pack_meta.json +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/linguistics/korean_slang/lexicon.py +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/linguistics/korean_slang/manifest.yaml +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/linguistics/korean_slang/skill.py +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/linguistics/korean_slang/test_skill.py +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/monitoring/__init__.py +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/monitoring/kpi_gate/__init__.py +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/monitoring/kpi_gate/card.json +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/monitoring/kpi_gate/fixtures/benchmarks_missing_ref.json +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/monitoring/kpi_gate/fixtures/charter_floor_boundary.yaml +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/monitoring/kpi_gate/fixtures/example_charter.yaml +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/monitoring/kpi_gate/fixtures/example_snapshot.json +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/monitoring/kpi_gate/fixtures/expected_findings.json +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/monitoring/kpi_gate/fixtures/invalid_benchmarks_schema.json +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/monitoring/kpi_gate/fixtures/invalid_charter_dependent_required.yaml +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/monitoring/kpi_gate/fixtures/invalid_charter_schema.yaml +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/monitoring/kpi_gate/fixtures/invalid_charter_unknown_denominator.yaml +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/monitoring/kpi_gate/fixtures/invalid_charter_unknown_rule_metric.yaml +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/monitoring/kpi_gate/fixtures/invalid_snapshot_schema.json +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/monitoring/kpi_gate/fixtures/snapshot_empty_metrics.json +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/monitoring/kpi_gate/fixtures/snapshot_floor_at_min.json +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/monitoring/kpi_gate/fixtures/snapshot_floor_below_min.json +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/monitoring/kpi_gate/fixtures/snapshot_unknown_key.json +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/monitoring/kpi_gate/instructions.md +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/monitoring/kpi_gate/kb/benchmarks_demo.json +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/monitoring/kpi_gate/manifest.yaml +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/monitoring/kpi_gate/schemas/benchmarks.schema.json +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/monitoring/kpi_gate/schemas/metrics.schema.json +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/monitoring/kpi_gate/schemas/policy.schema.json +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/monitoring/kpi_gate/skill.py +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/monitoring/kpi_gate/test_skill.py +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/monitoring/token_limiter/__init__.py +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/monitoring/token_limiter/budget.py +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/monitoring/token_limiter/card.json +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/monitoring/token_limiter/data/model_pricing.json +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/monitoring/token_limiter/instructions.md +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/monitoring/token_limiter/manifest.yaml +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/monitoring/token_limiter/skill.py +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/monitoring/token_limiter/test_skill.py +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/office/__init__.py +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/office/gmail_handler/__init__.py +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/office/gmail_handler/addressbook.py +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/office/gmail_handler/attachments.py +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/office/gmail_handler/card.json +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/office/gmail_handler/data/.gitignore +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/office/gmail_handler/data/addressbook.yaml +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/office/gmail_handler/data/config.yaml.example +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/office/gmail_handler/file_ref.py +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/office/gmail_handler/instructions.md +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/office/gmail_handler/mail.py +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/office/gmail_handler/manifest.yaml +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/office/gmail_handler/skill.py +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/office/gmail_handler/test_skill.py +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/office/pdf_form_filler/__init__.py +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/office/pdf_form_filler/card.json +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/office/pdf_form_filler/instructions.md +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/office/pdf_form_filler/utils.py +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/optimization/__init__.py +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/optimization/context_optimizer/__init__.py +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/optimization/context_optimizer/card.json +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/optimization/context_optimizer/data/sample_policy.txt +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/optimization/context_optimizer/instructions.md +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/optimization/context_optimizer/manifest.yaml +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/optimization/context_optimizer/skill.py +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/optimization/context_optimizer/test_skill.py +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/optimization/prompt_rewriter/__init__.py +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/optimization/prompt_rewriter/card.json +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/optimization/prompt_rewriter/instructions.md +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/optimization/prompt_rewriter/manifest.yaml +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/optimization/prompt_rewriter/test_skill.py +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/security/__init__.py +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/security/deceptive_ui_guard/__init__.py +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/security/deceptive_ui_guard/card.json +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/security/deceptive_ui_guard/guard.py +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/security/deceptive_ui_guard/instructions.md +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/security/deceptive_ui_guard/kb/allowlist_cmp.json +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/security/deceptive_ui_guard/kb/allowlist_seo.json +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/security/deceptive_ui_guard/kb/allowlist_sr_only.json +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/security/deceptive_ui_guard/kb/deception_lexicon.json +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/security/deceptive_ui_guard/manifest.yaml +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/security/deceptive_ui_guard/skill.py +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/security/deceptive_ui_guard/test_skill.py +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/security/prompt_injection_firewall/__init__.py +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/security/prompt_injection_firewall/card.json +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/security/prompt_injection_firewall/firewall.py +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/security/prompt_injection_firewall/fixtures/adversarial/leetspeak_override.txt +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/security/prompt_injection_firewall/fixtures/adversarial/markdown_image_exfil.txt +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/security/prompt_injection_firewall/fixtures/adversarial/mixed_script_injection.txt +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/security/prompt_injection_firewall/fixtures/adversarial/rot13_jailbreak.txt +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/security/prompt_injection_firewall/fixtures/adversarial/typoglycemia_attack.txt +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/security/prompt_injection_firewall/fixtures/benign/academic_jailbreak_paper.txt +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/security/prompt_injection_firewall/fixtures/benign/prompt_injection_advisory.md +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/security/prompt_injection_firewall/fixtures/benign/security_research_blog.txt +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/security/prompt_injection_firewall/instructions.md +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/security/prompt_injection_firewall/kb/confusables.json +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/security/prompt_injection_firewall/kb/injection_patterns.json +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/security/prompt_injection_firewall/manifest.yaml +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/security/prompt_injection_firewall/skill.py +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/security/prompt_injection_firewall/test_skill.py +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/wellness/__init__.py +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/wellness/mental_coach/__init__.py +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/wellness/mental_coach/card.json +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/wellness/mental_coach/constraints.py +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/wellness/mental_coach/crisis_gate.py +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/wellness/mental_coach/instructions.md +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/wellness/mental_coach/kb/corpus.json +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/wellness/mental_coach/kb/crisis_resources.json +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/wellness/mental_coach/kb/hard_constraints.yaml +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/wellness/mental_coach/kb_provider.py +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/wellness/mental_coach/manifest.yaml +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/wellness/mental_coach/resources.py +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/wellness/mental_coach/skill.py +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skills/wellness/mental_coach/test_skill.py +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skillware/__init__.py +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skillware/__main__.py +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skillware/branding/skillware_logo.png +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skillware/cli.py +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skillware/cli_addressbook.py +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skillware/cli_evm.py +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skillware/cli_mail.py +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skillware/cli_theme.py +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skillware/core/__init__.py +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skillware/core/chains_config.py +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skillware/core/config.py +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skillware/core/discovery.py +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skillware/core/env.py +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skillware/core/evm_config.py +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skillware/core/extras.py +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skillware/core/loader.py +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skillware/core/mail_config.py +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skillware/core/secrets.py +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skillware/core/ui_schema.py +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skillware/data/evm_defaults.yaml +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skillware.egg-info/dependency_links.txt +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skillware.egg-info/entry_points.txt +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/skillware.egg-info/top_level.txt +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/tests/test_card_ui_schema.py +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/tests/test_chains.py +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/tests/test_chains_config.py +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/tests/test_config.py +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/tests/test_context_and_chains_integration.py +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/tests/test_discovery.py +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/tests/test_evm_config.py +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/tests/test_evm_integration.py +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/tests/test_extras_sync.py +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/tests/test_github_labels.py +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/tests/test_host_simulation_stress.py +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/tests/test_loader.py +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/tests/test_mail_config.py +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/tests/test_registry_docs.py +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/tests/test_registry_identity.py +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/tests/test_requirements_check.py +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/tests/test_secrets.py +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/tests/test_skill_context.py +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/tests/test_skill_docs.py +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/tests/test_skill_issuer.py +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/tests/test_ui_schema.py +0 -0
- {skillware-0.5.7 → skillware-0.5.8}/tests/test_validate_params.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: skillware
|
|
3
|
-
Version: 0.5.
|
|
3
|
+
Version: 0.5.8
|
|
4
4
|
Summary: A framework for modular, self-contained AI skills.
|
|
5
5
|
Author-email: ARPA Hellenic Logical Systems <skillware-os@arpacorp.net>
|
|
6
6
|
License: MIT License
|
|
@@ -55,8 +55,13 @@ Requires-Dist: rich>=13.0
|
|
|
55
55
|
Provides-Extra: dev
|
|
56
56
|
Requires-Dist: pytest; extra == "dev"
|
|
57
57
|
Requires-Dist: pytest-mock; extra == "dev"
|
|
58
|
+
Requires-Dist: pytest-asyncio; extra == "dev"
|
|
58
59
|
Requires-Dist: flake8; extra == "dev"
|
|
59
60
|
Requires-Dist: black; extra == "dev"
|
|
61
|
+
Requires-Dist: ruff; extra == "dev"
|
|
62
|
+
Requires-Dist: bandit; extra == "dev"
|
|
63
|
+
Requires-Dist: pip-audit; extra == "dev"
|
|
64
|
+
Requires-Dist: mypy; extra == "dev"
|
|
60
65
|
Provides-Extra: gemini
|
|
61
66
|
Requires-Dist: google-genai; extra == "gemini"
|
|
62
67
|
Provides-Extra: claude
|
|
@@ -97,6 +102,8 @@ Provides-Extra: optimization
|
|
|
97
102
|
Requires-Dist: fastembed; extra == "optimization"
|
|
98
103
|
Requires-Dist: numpy; extra == "optimization"
|
|
99
104
|
Provides-Extra: security
|
|
105
|
+
Requires-Dist: numpy; extra == "security"
|
|
106
|
+
Requires-Dist: pillow; extra == "security"
|
|
100
107
|
Provides-Extra: wellness
|
|
101
108
|
Requires-Dist: google-genai; extra == "wellness"
|
|
102
109
|
Provides-Extra: compliance-mica-module
|
|
@@ -131,11 +138,15 @@ Provides-Extra: office-gmail-handler
|
|
|
131
138
|
Provides-Extra: office-pdf-form-filler
|
|
132
139
|
Requires-Dist: pymupdf; extra == "office-pdf-form-filler"
|
|
133
140
|
Requires-Dist: anthropic; extra == "office-pdf-form-filler"
|
|
141
|
+
Provides-Extra: office-web-form-mapper
|
|
134
142
|
Provides-Extra: optimization-context-optimizer
|
|
135
143
|
Requires-Dist: fastembed; extra == "optimization-context-optimizer"
|
|
136
144
|
Requires-Dist: numpy; extra == "optimization-context-optimizer"
|
|
137
145
|
Provides-Extra: optimization-prompt-rewriter
|
|
138
146
|
Provides-Extra: security-deceptive-ui-guard
|
|
147
|
+
Provides-Extra: security-deepfake-guard
|
|
148
|
+
Requires-Dist: pillow; extra == "security-deepfake-guard"
|
|
149
|
+
Requires-Dist: numpy; extra == "security-deepfake-guard"
|
|
139
150
|
Provides-Extra: security-prompt-injection-firewall
|
|
140
151
|
Provides-Extra: wellness-mental-coach
|
|
141
152
|
Requires-Dist: google-genai; extra == "wellness-mental-coach"
|
|
@@ -259,18 +270,18 @@ Category hubs live under `docs/skills/<category>/`. Full catalog: [Skill library
|
|
|
259
270
|
|
|
260
271
|
| Category | Skills | Description |
|
|
261
272
|
| :--- | :---: | :--- |
|
|
262
|
-
| [
|
|
273
|
+
| [Compliance](docs/skills/compliance/README.md) | 3 | Privacy, policy, and regulatory guardrails |
|
|
274
|
+
| [Data Engineering](docs/skills/data_engineering/README.md) | 3 | Datasets, generation, and ETL-style tooling |
|
|
275
|
+
| [DeFi](docs/skills/defi/README.md) | 3 | On-chain ops, trading, and agent wallet management |
|
|
276
|
+
| [Office](docs/skills/office/README.md) | 3 | Documents, desktop work, and productivity automation |
|
|
277
|
+
| [Security](docs/skills/security/README.md) | 3 | Defenses for untrusted input reaching logical systems |
|
|
263
278
|
| [Creative](docs/skills/creative/README.md) | 2 | Image processing, media editing, and creative utilities |
|
|
264
279
|
| [Finance](docs/skills/finance/README.md) | 2 | Fintech, blockchain, payments, and financial services |
|
|
265
|
-
| [
|
|
280
|
+
| [Monitoring](docs/skills/monitoring/README.md) | 2 | Agent loop observability, budget gates, and task control |
|
|
266
281
|
| [Optimization](docs/skills/optimization/README.md) | 2 | Middleware, efficiency, and token economics |
|
|
267
|
-
| [Data Engineering](docs/skills/data_engineering/README.md) | 3 | Datasets, generation, and ETL-style tooling |
|
|
268
|
-
| [Compliance](docs/skills/compliance/README.md) | 3 | Privacy, policy, and regulatory guardrails |
|
|
269
|
-
| [Security](docs/skills/security/README.md) | 2 | Defenses for untrusted input reaching logical systems |
|
|
270
282
|
| [Dev Tools](docs/skills/dev_tools/README.md) | 1 | Developer workflows, repo tooling, and coding |
|
|
271
|
-
| [Monitoring](docs/skills/monitoring/README.md) | 2 | Agent loop observability, budget gates, and task control |
|
|
272
|
-
| [Wellness](docs/skills/wellness/README.md) | 1 | Coaching guardrails and mental health support |
|
|
273
283
|
| [Linguistics](docs/skills/linguistics/README.md) | 1 | Language adapters and internet-register lexicons |
|
|
284
|
+
| [Wellness](docs/skills/wellness/README.md) | 1 | Coaching guardrails and mental health support |
|
|
274
285
|
|
|
275
286
|
## Quick Start
|
|
276
287
|
|
|
@@ -400,7 +411,7 @@ PyPI download counts measure **install activity** from public aggregators (inclu
|
|
|
400
411
|
|
|
401
412
|
<a href="https://doi.org/10.5281/zenodo.21552745"><img src="https://img.shields.io/badge/DOI-10.5281%2Fzenodo.21552745-c7d2fe?style=flat-square" alt="DOI 10.5281/zenodo.21552745"></a>
|
|
402
413
|
|
|
403
|
-
If you use Skillware in research or products, please cite it using [CITATION.cff](CITATION.cff) (GitHub **Cite this repository**) or the Zenodo **concept DOI** above. That DOI is stable across releases. For reproducibility, also record the **Skillware version** you used (PyPI or Git tag, for example `0.5.
|
|
414
|
+
If you use Skillware in research or products, please cite it using [CITATION.cff](CITATION.cff) (GitHub **Cite this repository**) or the Zenodo **concept DOI** above. That DOI is stable across releases. For reproducibility, also record the **Skillware version** you used (PyPI or Git tag, for example `0.5.8`).
|
|
404
415
|
|
|
405
416
|
## Contact
|
|
406
417
|
|
|
@@ -104,18 +104,18 @@ Category hubs live under `docs/skills/<category>/`. Full catalog: [Skill library
|
|
|
104
104
|
|
|
105
105
|
| Category | Skills | Description |
|
|
106
106
|
| :--- | :---: | :--- |
|
|
107
|
-
| [
|
|
107
|
+
| [Compliance](docs/skills/compliance/README.md) | 3 | Privacy, policy, and regulatory guardrails |
|
|
108
|
+
| [Data Engineering](docs/skills/data_engineering/README.md) | 3 | Datasets, generation, and ETL-style tooling |
|
|
109
|
+
| [DeFi](docs/skills/defi/README.md) | 3 | On-chain ops, trading, and agent wallet management |
|
|
110
|
+
| [Office](docs/skills/office/README.md) | 3 | Documents, desktop work, and productivity automation |
|
|
111
|
+
| [Security](docs/skills/security/README.md) | 3 | Defenses for untrusted input reaching logical systems |
|
|
108
112
|
| [Creative](docs/skills/creative/README.md) | 2 | Image processing, media editing, and creative utilities |
|
|
109
113
|
| [Finance](docs/skills/finance/README.md) | 2 | Fintech, blockchain, payments, and financial services |
|
|
110
|
-
| [
|
|
114
|
+
| [Monitoring](docs/skills/monitoring/README.md) | 2 | Agent loop observability, budget gates, and task control |
|
|
111
115
|
| [Optimization](docs/skills/optimization/README.md) | 2 | Middleware, efficiency, and token economics |
|
|
112
|
-
| [Data Engineering](docs/skills/data_engineering/README.md) | 3 | Datasets, generation, and ETL-style tooling |
|
|
113
|
-
| [Compliance](docs/skills/compliance/README.md) | 3 | Privacy, policy, and regulatory guardrails |
|
|
114
|
-
| [Security](docs/skills/security/README.md) | 2 | Defenses for untrusted input reaching logical systems |
|
|
115
116
|
| [Dev Tools](docs/skills/dev_tools/README.md) | 1 | Developer workflows, repo tooling, and coding |
|
|
116
|
-
| [Monitoring](docs/skills/monitoring/README.md) | 2 | Agent loop observability, budget gates, and task control |
|
|
117
|
-
| [Wellness](docs/skills/wellness/README.md) | 1 | Coaching guardrails and mental health support |
|
|
118
117
|
| [Linguistics](docs/skills/linguistics/README.md) | 1 | Language adapters and internet-register lexicons |
|
|
118
|
+
| [Wellness](docs/skills/wellness/README.md) | 1 | Coaching guardrails and mental health support |
|
|
119
119
|
|
|
120
120
|
## Quick Start
|
|
121
121
|
|
|
@@ -245,7 +245,7 @@ PyPI download counts measure **install activity** from public aggregators (inclu
|
|
|
245
245
|
|
|
246
246
|
<a href="https://doi.org/10.5281/zenodo.21552745"><img src="https://img.shields.io/badge/DOI-10.5281%2Fzenodo.21552745-c7d2fe?style=flat-square" alt="DOI 10.5281/zenodo.21552745"></a>
|
|
247
247
|
|
|
248
|
-
If you use Skillware in research or products, please cite it using [CITATION.cff](CITATION.cff) (GitHub **Cite this repository**) or the Zenodo **concept DOI** above. That DOI is stable across releases. For reproducibility, also record the **Skillware version** you used (PyPI or Git tag, for example `0.5.
|
|
248
|
+
If you use Skillware in research or products, please cite it using [CITATION.cff](CITATION.cff) (GitHub **Cite this repository**) or the Zenodo **concept DOI** above. That DOI is stable across releases. For reproducibility, also record the **Skillware version** you used (PyPI or Git tag, for example `0.5.8`).
|
|
249
249
|
|
|
250
250
|
## Contact
|
|
251
251
|
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "skillware"
|
|
7
|
-
version = "0.5.
|
|
7
|
+
version = "0.5.8"
|
|
8
8
|
description = "A framework for modular, self-contained AI skills."
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
authors = [
|
|
@@ -51,8 +51,13 @@ skillware = "skillware.cli:main"
|
|
|
51
51
|
dev = [
|
|
52
52
|
"pytest",
|
|
53
53
|
"pytest-mock",
|
|
54
|
+
"pytest-asyncio",
|
|
54
55
|
"flake8",
|
|
55
56
|
"black",
|
|
57
|
+
"ruff",
|
|
58
|
+
"bandit",
|
|
59
|
+
"pip-audit",
|
|
60
|
+
"mypy",
|
|
56
61
|
]
|
|
57
62
|
gemini = [
|
|
58
63
|
"google-genai",
|
|
@@ -119,7 +124,10 @@ optimization = [
|
|
|
119
124
|
"numpy",
|
|
120
125
|
]
|
|
121
126
|
|
|
122
|
-
security = [
|
|
127
|
+
security = [
|
|
128
|
+
"numpy",
|
|
129
|
+
"pillow",
|
|
130
|
+
]
|
|
123
131
|
|
|
124
132
|
wellness = [
|
|
125
133
|
"google-genai",
|
|
@@ -184,6 +192,8 @@ office_pdf_form_filler = [
|
|
|
184
192
|
"anthropic",
|
|
185
193
|
]
|
|
186
194
|
|
|
195
|
+
office_web_form_mapper = []
|
|
196
|
+
|
|
187
197
|
optimization_context_optimizer = [
|
|
188
198
|
"fastembed",
|
|
189
199
|
"numpy",
|
|
@@ -193,6 +203,11 @@ optimization_prompt_rewriter = []
|
|
|
193
203
|
|
|
194
204
|
security_deceptive_ui_guard = []
|
|
195
205
|
|
|
206
|
+
security_deepfake_guard = [
|
|
207
|
+
"pillow",
|
|
208
|
+
"numpy",
|
|
209
|
+
]
|
|
210
|
+
|
|
196
211
|
security_prompt_injection_firewall = []
|
|
197
212
|
|
|
198
213
|
wellness_mental_coach = [
|
|
@@ -237,3 +252,36 @@ markers = [
|
|
|
237
252
|
[tool.black]
|
|
238
253
|
line-length = 88
|
|
239
254
|
target-version = ["py310"]
|
|
255
|
+
|
|
256
|
+
[tool.ruff]
|
|
257
|
+
line-length = 120
|
|
258
|
+
target-version = "py310"
|
|
259
|
+
|
|
260
|
+
[tool.ruff.lint]
|
|
261
|
+
select = [
|
|
262
|
+
"E4", "E7", "E9",
|
|
263
|
+
"F",
|
|
264
|
+
]
|
|
265
|
+
ignore = [
|
|
266
|
+
"E501",
|
|
267
|
+
]
|
|
268
|
+
|
|
269
|
+
[tool.mypy]
|
|
270
|
+
python_version = "3.10"
|
|
271
|
+
ignore_missing_imports = true
|
|
272
|
+
warn_unused_configs = true
|
|
273
|
+
|
|
274
|
+
[[tool.mypy.overrides]]
|
|
275
|
+
module = [
|
|
276
|
+
"skillware.cli",
|
|
277
|
+
"skillware.core.loader",
|
|
278
|
+
"skillware.core.config",
|
|
279
|
+
"skillware.core.mail_config",
|
|
280
|
+
"skillware.core.ui_schema",
|
|
281
|
+
"skillware.version_policy",
|
|
282
|
+
]
|
|
283
|
+
ignore_errors = true
|
|
284
|
+
|
|
285
|
+
[tool.bandit]
|
|
286
|
+
exclude_dirs = ["tests", "build", "dist"]
|
|
287
|
+
skips = ["B101", "B104", "B108", "B310"]
|
|
@@ -6,4 +6,5 @@ Use this skill whenever a user asks questions regarding the Markets in Crypto-As
|
|
|
6
6
|
**Core Directives:**
|
|
7
7
|
1. **RAG-Driven Answers**: You MUST use the `user_prompt` parameter to retrieve specific statutory text before answering.
|
|
8
8
|
2. **Traceability**: Your final response MUST explicitly cite the Article numbers provided in the context (e.g., "According to Article 59...").
|
|
9
|
-
3. **Policy Enforcement**: If the evaluator flags `HIGH_RISK_DETECTED`, you must prioritize regulatory safety and clearly state the compliance barriers.
|
|
9
|
+
3. **Policy Enforcement**: If the evaluator flags `HIGH_RISK_DETECTED`, you must prioritize regulatory safety and clearly state the compliance barriers.
|
|
10
|
+
4. **Statutory Snapshot Framing**: Remind users that citations reflect the bundled MiCA snapshot (Regulation (EU) 2023/1114, OJ L 150/40, 9 June 2023) and serve as informational reference for offline decision-support — not formal legal advice. Advise verifying current amendments with qualified counsel for binding compliance determinations.
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
name: compliance/mica_module
|
|
2
|
-
version: 0.1.
|
|
2
|
+
version: 0.1.2
|
|
3
3
|
description: A highly specialized, localized RAG and policy enforcement engine for the Markets in Crypto-Assets (MiCA) regulation.
|
|
4
4
|
short_description: "Local RAG and policy enforcement engine for MiCA regulation."
|
|
5
5
|
issuer:
|
|
@@ -31,3 +31,4 @@ constitution: |
|
|
|
31
31
|
1. COMPLIANCE: Do not invent or hallucinate financial regulations. Base all enforcement strictly on the provided MiCA corpus blocks.
|
|
32
32
|
2. FOCUS: Act exclusively as a compliance firewall and RAG engine; retrieve relevant chunks incrementally.
|
|
33
33
|
3. EVALUATION: If the evaluator is run, strictly flag HIGH_RISK_DETECTED if the user's intent violates MiCA or misses required filings.
|
|
34
|
+
4. INFORMATIONAL REFERENCE: Retrieved regulatory provisions and evaluations are decision-support material from a bundled statutory snapshot. Do not present outputs as formal legal counsel; remind users that MiCA evolves and qualified professionals should confirm binding determinations.
|
|
@@ -4,6 +4,9 @@ from typing import Any, Dict, List
|
|
|
4
4
|
|
|
5
5
|
from skillware.core.base_skill import BaseSkill
|
|
6
6
|
|
|
7
|
+
# Bundled MiCA corpus snapshot — informational reference, not live legal portal data.
|
|
8
|
+
STATUTORY_SNAPSHOT = "Regulation (EU) 2023/1114 (MiCA), OJ L 150/40, 9 June 2023"
|
|
9
|
+
|
|
7
10
|
|
|
8
11
|
class MiCAModuleSkill(BaseSkill):
|
|
9
12
|
"""
|
|
@@ -12,7 +15,7 @@ class MiCAModuleSkill(BaseSkill):
|
|
|
12
15
|
|
|
13
16
|
@property
|
|
14
17
|
def manifest(self) -> Dict[str, Any]:
|
|
15
|
-
return
|
|
18
|
+
return self.load_manifest_from_dir(os.path.dirname(__file__))
|
|
16
19
|
|
|
17
20
|
_corpus_cache: List[Dict[str, Any]] = None
|
|
18
21
|
|
|
@@ -90,6 +93,7 @@ class MiCAModuleSkill(BaseSkill):
|
|
|
90
93
|
final_context = eval_result.get("final_context_for_agent", final_context)
|
|
91
94
|
|
|
92
95
|
return {
|
|
96
|
+
"statutory_snapshot": STATUTORY_SNAPSHOT,
|
|
93
97
|
"retrieved_sections": list(set(retrieved_sections)),
|
|
94
98
|
"policy_status": policy_status,
|
|
95
99
|
"gemini_evaluator_feedback": gemini_feedback,
|
|
@@ -22,6 +22,7 @@ def test_skill_manifest_consistency(skill, manifest):
|
|
|
22
22
|
skill_manifest = skill.manifest
|
|
23
23
|
assert skill_manifest["name"] == manifest["name"]
|
|
24
24
|
assert skill_manifest["version"] == manifest["version"]
|
|
25
|
+
assert "informational reference" in skill_manifest["constitution"].lower()
|
|
25
26
|
|
|
26
27
|
|
|
27
28
|
def test_stateless_rag_execution(skill):
|
|
@@ -34,6 +35,9 @@ def test_stateless_rag_execution(skill):
|
|
|
34
35
|
"run_evaluator": False,
|
|
35
36
|
}
|
|
36
37
|
)
|
|
38
|
+
assert result["statutory_snapshot"] == (
|
|
39
|
+
"Regulation (EU) 2023/1114 (MiCA), OJ L 150/40, 9 June 2023"
|
|
40
|
+
)
|
|
37
41
|
assert result["policy_status"] == "CAUTION"
|
|
38
42
|
assert "retrieved_sections" in result
|
|
39
43
|
assert "final_context_for_agent" in result
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import os
|
|
1
2
|
import re
|
|
2
3
|
import requests
|
|
3
4
|
from typing import Any, Dict, List, Tuple
|
|
@@ -11,7 +12,7 @@ class PIIMaskerSkill(BaseSkill):
|
|
|
11
12
|
|
|
12
13
|
@property
|
|
13
14
|
def manifest(self) -> Dict[str, Any]:
|
|
14
|
-
return
|
|
15
|
+
return self.load_manifest_from_dir(os.path.dirname(__file__))
|
|
15
16
|
|
|
16
17
|
def execute(self, params: Dict[str, Any]) -> Dict[str, Any]:
|
|
17
18
|
text = params.get("text", "")
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import os
|
|
1
2
|
from typing import Any, Dict, List
|
|
2
3
|
import numpy as np
|
|
3
4
|
from fastembed import TextEmbedding
|
|
@@ -18,14 +19,7 @@ class NoveltyExtractor(BaseSkill):
|
|
|
18
19
|
|
|
19
20
|
@property
|
|
20
21
|
def manifest(self) -> Dict[str, Any]:
|
|
21
|
-
return
|
|
22
|
-
"name": "data_engineering/novelty_extractor",
|
|
23
|
-
"version": "0.1.0",
|
|
24
|
-
"description": (
|
|
25
|
-
"Filters a text dataset by semantic novelty, retaining only "
|
|
26
|
-
"chunks that carry new information above a configurable threshold."
|
|
27
|
-
),
|
|
28
|
-
}
|
|
22
|
+
return self.load_manifest_from_dir(os.path.dirname(__file__))
|
|
29
23
|
|
|
30
24
|
def _chunk_text(self, text: str, strategy: str) -> List[str]:
|
|
31
25
|
"""Split text into chunks using the given strategy."""
|
|
@@ -7,6 +7,7 @@ import os
|
|
|
7
7
|
from unittest.mock import MagicMock, patch
|
|
8
8
|
|
|
9
9
|
import pytest
|
|
10
|
+
import requests
|
|
10
11
|
import yaml
|
|
11
12
|
|
|
12
13
|
from skillware.core.loader import SkillLoader
|
|
@@ -177,7 +178,7 @@ def test_scan_medium_proxy_mint(mock_get, skill):
|
|
|
177
178
|
def test_rate_limited(mock_get, skill):
|
|
178
179
|
response = MagicMock()
|
|
179
180
|
response.status_code = 429
|
|
180
|
-
response.raise_for_status.side_effect =
|
|
181
|
+
response.raise_for_status.side_effect = requests.exceptions.HTTPError(
|
|
181
182
|
response=response
|
|
182
183
|
)
|
|
183
184
|
mock_get.return_value = response
|
|
@@ -5,6 +5,35 @@ import anthropic
|
|
|
5
5
|
import yaml
|
|
6
6
|
from skillware.core.base_skill import BaseSkill
|
|
7
7
|
|
|
8
|
+
# SkillLoader runs this file as a standalone module, so the relative import only
|
|
9
|
+
# works when the bundle is imported as a package. Fall back to the package path,
|
|
10
|
+
# then load the sibling utils.py under a unique module name. Do not modify
|
|
11
|
+
# sys.path or import a top-level "utils" module, which can clash with the host.
|
|
12
|
+
try:
|
|
13
|
+
from .utils import detect_form_fields, apply_edits, FieldEdit
|
|
14
|
+
except (ImportError, ValueError):
|
|
15
|
+
try:
|
|
16
|
+
from skills.office.pdf_form_filler.utils import (
|
|
17
|
+
detect_form_fields,
|
|
18
|
+
apply_edits,
|
|
19
|
+
FieldEdit,
|
|
20
|
+
)
|
|
21
|
+
except (ImportError, ValueError):
|
|
22
|
+
import importlib.util
|
|
23
|
+
|
|
24
|
+
_utils_spec = importlib.util.spec_from_file_location(
|
|
25
|
+
"pdf_form_filler_utils",
|
|
26
|
+
os.path.join(os.path.dirname(os.path.abspath(__file__)), "utils.py"),
|
|
27
|
+
)
|
|
28
|
+
if _utils_spec and _utils_spec.loader:
|
|
29
|
+
_utils_module = importlib.util.module_from_spec(_utils_spec)
|
|
30
|
+
_utils_spec.loader.exec_module(_utils_module)
|
|
31
|
+
detect_form_fields = _utils_module.detect_form_fields
|
|
32
|
+
apply_edits = _utils_module.apply_edits
|
|
33
|
+
FieldEdit = _utils_module.FieldEdit
|
|
34
|
+
else:
|
|
35
|
+
raise ImportError("Could not load utils.py for office/pdf_form_filler")
|
|
36
|
+
|
|
8
37
|
|
|
9
38
|
class PDFFormFillerSkill(BaseSkill):
|
|
10
39
|
"""
|
|
@@ -26,15 +55,6 @@ class PDFFormFillerSkill(BaseSkill):
|
|
|
26
55
|
return {}
|
|
27
56
|
|
|
28
57
|
def execute(self, params: Dict[str, Any]) -> Any:
|
|
29
|
-
# Import here to avoid top-level linter issues with relative imports
|
|
30
|
-
try:
|
|
31
|
-
from .utils import detect_form_fields, apply_edits, FieldEdit
|
|
32
|
-
except ImportError:
|
|
33
|
-
import sys
|
|
34
|
-
|
|
35
|
-
sys.path.append(os.path.dirname(__file__))
|
|
36
|
-
from utils import detect_form_fields, apply_edits, FieldEdit
|
|
37
|
-
|
|
38
58
|
# 1. Parse Inputs
|
|
39
59
|
pdf_path = params.get("pdf_path")
|
|
40
60
|
instructions = params.get("instructions")
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
import os
|
|
2
|
+
import sys
|
|
3
|
+
import types
|
|
4
|
+
from unittest.mock import MagicMock, patch
|
|
5
|
+
|
|
6
|
+
import fitz
|
|
7
|
+
import pytest
|
|
8
|
+
import yaml
|
|
9
|
+
|
|
10
|
+
from skillware.core.loader import SkillLoader
|
|
11
|
+
|
|
12
|
+
from .skill import PDFFormFillerSkill
|
|
13
|
+
|
|
14
|
+
# Module that provides detect_form_fields for each helper import route in skill.py.
|
|
15
|
+
HELPER_MODULE_BY_ROUTE = {
|
|
16
|
+
"package": "skills.office.pdf_form_filler.utils",
|
|
17
|
+
"file": "pdf_form_filler_utils",
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
@pytest.fixture
|
|
22
|
+
def skill():
|
|
23
|
+
return PDFFormFillerSkill()
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
@pytest.fixture
|
|
27
|
+
def manifest():
|
|
28
|
+
manifest_path = os.path.join(os.path.dirname(__file__), "manifest.yaml")
|
|
29
|
+
with open(manifest_path, "r", encoding="utf-8") as f:
|
|
30
|
+
return yaml.safe_load(f)
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
def test_skill_manifest_consistency(skill, manifest):
|
|
34
|
+
skill_manifest = skill.manifest
|
|
35
|
+
assert skill_manifest["name"] == manifest["name"]
|
|
36
|
+
assert manifest["name"] == "office/pdf_form_filler"
|
|
37
|
+
assert skill_manifest["version"] == manifest["version"]
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
def test_missing_pdf_returns_error(skill):
|
|
41
|
+
result = skill.execute(
|
|
42
|
+
{
|
|
43
|
+
"pdf_path": "/nonexistent/form.pdf",
|
|
44
|
+
"instructions": "Fill name with Alice",
|
|
45
|
+
}
|
|
46
|
+
)
|
|
47
|
+
assert "error" in result
|
|
48
|
+
assert "PDF file not found" in result["error"]
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
def test_missing_instructions_returns_error(skill, tmp_path):
|
|
52
|
+
pdf_path = tmp_path / "blank.pdf"
|
|
53
|
+
doc = fitz.open()
|
|
54
|
+
doc.new_page()
|
|
55
|
+
doc.save(str(pdf_path))
|
|
56
|
+
doc.close()
|
|
57
|
+
|
|
58
|
+
result = skill.execute({"pdf_path": str(pdf_path), "instructions": ""})
|
|
59
|
+
assert "error" in result
|
|
60
|
+
assert "No instructions provided" in result["error"]
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
@patch("skills.office.pdf_form_filler.skill.anthropic.Anthropic")
|
|
64
|
+
def test_execute_mocked(mock_anthropic_cls, tmp_path, monkeypatch):
|
|
65
|
+
mock_client = mock_anthropic_cls.return_value
|
|
66
|
+
mock_message = MagicMock()
|
|
67
|
+
mock_message.content = [MagicMock(text='{"page0_test_field": "Hello World"}')]
|
|
68
|
+
mock_client.messages.create.return_value = mock_message
|
|
69
|
+
monkeypatch.setenv("ANTHROPIC_API_KEY", "test")
|
|
70
|
+
|
|
71
|
+
skill = PDFFormFillerSkill()
|
|
72
|
+
|
|
73
|
+
pdf_path = tmp_path / "form.pdf"
|
|
74
|
+
doc = fitz.open()
|
|
75
|
+
page = doc.new_page()
|
|
76
|
+
widget = fitz.Widget()
|
|
77
|
+
widget.rect = fitz.Rect(10, 10, 100, 30)
|
|
78
|
+
widget.field_name = "test_field"
|
|
79
|
+
widget.field_type = 7
|
|
80
|
+
page.add_widget(widget)
|
|
81
|
+
doc.save(str(pdf_path))
|
|
82
|
+
doc.close()
|
|
83
|
+
|
|
84
|
+
result = skill.execute(
|
|
85
|
+
{
|
|
86
|
+
"pdf_path": str(pdf_path),
|
|
87
|
+
"instructions": "Fill test field with Hello World",
|
|
88
|
+
}
|
|
89
|
+
)
|
|
90
|
+
|
|
91
|
+
assert result["status"] == "success"
|
|
92
|
+
assert "page0_test_field" in result["filled_fields"]
|
|
93
|
+
assert os.path.exists(result["output_path"])
|
|
94
|
+
|
|
95
|
+
if os.path.exists(result["output_path"]):
|
|
96
|
+
os.remove(result["output_path"])
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
@pytest.fixture(params=sorted(HELPER_MODULE_BY_ROUTE))
|
|
100
|
+
def import_route(request, monkeypatch):
|
|
101
|
+
"""Helper import route taken when SkillLoader runs skill.py as ``skill_module``.
|
|
102
|
+
|
|
103
|
+
``package`` resolves the helpers through the installed ``skills`` package.
|
|
104
|
+
``file`` blocks that import so the sibling ``utils.py`` is loaded by path,
|
|
105
|
+
as it would be for a bundle outside the package.
|
|
106
|
+
"""
|
|
107
|
+
monkeypatch.setattr(sys, "path", list(sys.path))
|
|
108
|
+
if request.param == "file":
|
|
109
|
+
monkeypatch.setitem(sys.modules, HELPER_MODULE_BY_ROUTE["package"], None)
|
|
110
|
+
return request.param
|
|
111
|
+
|
|
112
|
+
|
|
113
|
+
def _load_via_skill_loader():
|
|
114
|
+
bundle = SkillLoader.load_skill("office/pdf_form_filler")
|
|
115
|
+
assert bundle["module"].__name__ == "skill_module"
|
|
116
|
+
return bundle
|
|
117
|
+
|
|
118
|
+
|
|
119
|
+
def _blank_pdf(tmp_path):
|
|
120
|
+
pdf_path = tmp_path / "blank.pdf"
|
|
121
|
+
doc = fitz.open()
|
|
122
|
+
doc.new_page()
|
|
123
|
+
doc.save(str(pdf_path))
|
|
124
|
+
doc.close()
|
|
125
|
+
return pdf_path
|
|
126
|
+
|
|
127
|
+
|
|
128
|
+
def test_loader_execute_leaves_sys_path_unchanged(import_route):
|
|
129
|
+
before = list(sys.path)
|
|
130
|
+
skill = _load_via_skill_loader()["class"]()
|
|
131
|
+
|
|
132
|
+
for _ in range(3):
|
|
133
|
+
result = skill.execute(
|
|
134
|
+
{"pdf_path": "/nonexistent/form.pdf", "instructions": "Fill name"}
|
|
135
|
+
)
|
|
136
|
+
assert "PDF file not found" in result["error"]
|
|
137
|
+
|
|
138
|
+
assert sys.path == before
|
|
139
|
+
|
|
140
|
+
|
|
141
|
+
def test_loader_execute_with_host_utils_module(import_route, monkeypatch, tmp_path):
|
|
142
|
+
host_utils = types.ModuleType("utils")
|
|
143
|
+
monkeypatch.setitem(sys.modules, "utils", host_utils)
|
|
144
|
+
bundle = _load_via_skill_loader()
|
|
145
|
+
|
|
146
|
+
result = bundle["class"]().execute(
|
|
147
|
+
{"pdf_path": str(_blank_pdf(tmp_path)), "instructions": "Fill name"}
|
|
148
|
+
)
|
|
149
|
+
|
|
150
|
+
assert result == {
|
|
151
|
+
"status": "warning",
|
|
152
|
+
"message": "No fillable fields found in PDF.",
|
|
153
|
+
}
|
|
154
|
+
assert sys.modules["utils"] is host_utils
|
|
155
|
+
assert (
|
|
156
|
+
bundle["module"].detect_form_fields.__module__
|
|
157
|
+
== HELPER_MODULE_BY_ROUTE[import_route]
|
|
158
|
+
)
|
|
159
|
+
|
|
160
|
+
|
|
161
|
+
def test_loader_execute_does_not_register_top_level_utils(import_route, monkeypatch):
|
|
162
|
+
monkeypatch.delitem(sys.modules, "utils", raising=False)
|
|
163
|
+
skill = _load_via_skill_loader()["class"]()
|
|
164
|
+
|
|
165
|
+
skill.execute({"pdf_path": "/nonexistent/form.pdf", "instructions": "Fill name"})
|
|
166
|
+
|
|
167
|
+
assert "utils" not in sys.modules
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"""office/web_form_mapper skill package."""
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "Web Form Mapper",
|
|
3
|
+
"description": "Inspects, maps identity profiles to, previews, and submits web forms with confirmation gates.",
|
|
4
|
+
"issuer": {
|
|
5
|
+
"name": "Ross Peili",
|
|
6
|
+
"email": "vpeilivanidis@gmail.com",
|
|
7
|
+
"github": "rosspeili",
|
|
8
|
+
"org": "ARPAHLS"
|
|
9
|
+
},
|
|
10
|
+
"icon": "globe",
|
|
11
|
+
"color": "blue",
|
|
12
|
+
"ui_schema": {
|
|
13
|
+
"type": "card",
|
|
14
|
+
"fields": [
|
|
15
|
+
{
|
|
16
|
+
"key": "status",
|
|
17
|
+
"label": "Status"
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
"key": "action",
|
|
21
|
+
"label": "Action"
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
"key": "form_action",
|
|
25
|
+
"label": "Endpoint"
|
|
26
|
+
}
|
|
27
|
+
]
|
|
28
|
+
}
|
|
29
|
+
}
|