mdfetch 0.9.0__tar.gz → 0.9.2__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.
- mdfetch-0.9.2/.github/scripts/generate_resources.py +59 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/.github/workflows/publish.yml +21 -1
- {mdfetch-0.9.0 → mdfetch-0.9.2}/PKG-INFO +1 -1
- {mdfetch-0.9.0 → mdfetch-0.9.2}/pyproject.toml +1 -1
- {mdfetch-0.9.0 → mdfetch-0.9.2}/src/mdfetch/fallback.py +8 -2
- {mdfetch-0.9.0 → mdfetch-0.9.2}/tests/unit/test_fallback.py +4 -4
- {mdfetch-0.9.0 → mdfetch-0.9.2}/uv.lock +1 -1
- {mdfetch-0.9.0 → mdfetch-0.9.2}/.agents/skills/speckit-analyze/SKILL.md +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/.agents/skills/speckit-checklist/SKILL.md +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/.agents/skills/speckit-clarify/SKILL.md +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/.agents/skills/speckit-constitution/SKILL.md +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/.agents/skills/speckit-converge/SKILL.md +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/.agents/skills/speckit-implement/SKILL.md +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/.agents/skills/speckit-plan/SKILL.md +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/.agents/skills/speckit-specify/SKILL.md +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/.agents/skills/speckit-tasks/SKILL.md +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/.agents/skills/speckit-taskstoissues/SKILL.md +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/.claude/skills/speckit-analyze/SKILL.md +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/.claude/skills/speckit-archive-run/SKILL.md +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/.claude/skills/speckit-checklist/SKILL.md +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/.claude/skills/speckit-clarify/SKILL.md +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/.claude/skills/speckit-constitution/SKILL.md +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/.claude/skills/speckit-converge/SKILL.md +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/.claude/skills/speckit-git-commit/SKILL.md +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/.claude/skills/speckit-git-feature/SKILL.md +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/.claude/skills/speckit-git-initialize/SKILL.md +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/.claude/skills/speckit-git-remote/SKILL.md +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/.claude/skills/speckit-git-validate/SKILL.md +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/.claude/skills/speckit-implement/SKILL.md +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/.claude/skills/speckit-plan/SKILL.md +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/.claude/skills/speckit-reconcile-run/SKILL.md +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/.claude/skills/speckit-specify/SKILL.md +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/.claude/skills/speckit-tasks/SKILL.md +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/.claude/skills/speckit-taskstoissues/SKILL.md +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/.gemini/commands/speckit.analyze.toml +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/.gemini/commands/speckit.checklist.toml +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/.gemini/commands/speckit.clarify.toml +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/.gemini/commands/speckit.constitution.toml +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/.gemini/commands/speckit.implement.toml +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/.gemini/commands/speckit.plan.toml +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/.gemini/commands/speckit.specify.toml +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/.gemini/commands/speckit.tasks.toml +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/.gemini/commands/speckit.taskstoissues.toml +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/.gitattributes +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/.github/copilot-instructions.md +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/.github/workflows/ci.yml +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/.github/workflows/integration.yml +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/.gitignore +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/.python-version +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/.specify/extensions/.registry +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/.specify/extensions/archive/LICENSE +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/.specify/extensions/archive/README.md +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/.specify/extensions/archive/commands/archive.md +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/.specify/extensions/archive/extension.yml +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/.specify/extensions/git/README.md +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/.specify/extensions/git/commands/speckit.git.commit.md +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/.specify/extensions/git/commands/speckit.git.feature.md +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/.specify/extensions/git/commands/speckit.git.initialize.md +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/.specify/extensions/git/commands/speckit.git.remote.md +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/.specify/extensions/git/commands/speckit.git.validate.md +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/.specify/extensions/git/config-template.yml +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/.specify/extensions/git/extension.yml +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/.specify/extensions/git/git-config.yml +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/.specify/extensions/git/scripts/bash/auto-commit.sh +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/.specify/extensions/git/scripts/bash/create-new-feature.sh +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/.specify/extensions/git/scripts/bash/git-common.sh +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/.specify/extensions/git/scripts/bash/initialize-repo.sh +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/.specify/extensions/git/scripts/powershell/auto-commit.ps1 +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/.specify/extensions/git/scripts/powershell/create-new-feature.ps1 +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/.specify/extensions/git/scripts/powershell/git-common.ps1 +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/.specify/extensions/git/scripts/powershell/initialize-repo.ps1 +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/.specify/extensions/reconcile/LICENSE +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/.specify/extensions/reconcile/README.md +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/.specify/extensions/reconcile/commands/reconcile.md +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/.specify/extensions/reconcile/extension.yml +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/.specify/extensions.yml +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/.specify/feature.json +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/.specify/init-options.json +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/.specify/integration.json +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/.specify/integrations/agy.manifest.json +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/.specify/integrations/claude.manifest.json +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/.specify/integrations/gemini.manifest.json +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/.specify/integrations/speckit.manifest.json +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/.specify/memory/changelog.md +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/.specify/memory/constitution.md +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/.specify/memory/plan.md +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/.specify/memory/spec.md +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/.specify/scripts/bash/check-prerequisites.sh +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/.specify/scripts/bash/common.sh +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/.specify/scripts/bash/create-new-feature.sh +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/.specify/scripts/bash/setup-plan.sh +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/.specify/scripts/bash/setup-tasks.sh +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/.specify/templates/checklist-template.md +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/.specify/templates/constitution-template.md +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/.specify/templates/plan-template.md +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/.specify/templates/spec-template.md +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/.specify/templates/tasks-template.md +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/.specify/workflows/speckit/workflow.yml +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/.specify/workflows/workflow-registry.json +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/.vscode/settings.json +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/CLAUDE.md +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/GEMINI.md +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/LICENSE +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/Makefile +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/README.md +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/001-mdfetch-medium-extractor/checklists/requirements.md +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/001-mdfetch-medium-extractor/contracts/api.md +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/001-mdfetch-medium-extractor/data-model.md +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/001-mdfetch-medium-extractor/plan.md +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/001-mdfetch-medium-extractor/quickstart.md +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/001-mdfetch-medium-extractor/research.md +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/001-mdfetch-medium-extractor/spec.md +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/001-mdfetch-medium-extractor/tasks.md +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/002-devto-provider/checklists/requirements.md +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/002-devto-provider/contracts/public-api.md +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/002-devto-provider/data-model.md +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/002-devto-provider/plan.md +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/002-devto-provider/quickstart.md +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/002-devto-provider/research.md +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/002-devto-provider/spec.md +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/002-devto-provider/tasks.md +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/003-medium-freedium-fallback/checklists/requirements.md +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/003-medium-freedium-fallback/contracts/extract-api.md +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/003-medium-freedium-fallback/plan.md +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/003-medium-freedium-fallback/research.md +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/003-medium-freedium-fallback/spec.md +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/003-medium-freedium-fallback/tasks.md +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/004-remove-backoff/checklists/requirements.md +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/004-remove-backoff/plan.md +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/004-remove-backoff/research.md +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/004-remove-backoff/spec.md +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/004-remove-backoff/tasks.md +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/005-substack-provider/checklists/requirements.md +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/005-substack-provider/contracts/extractor-api.md +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/005-substack-provider/data-model.md +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/005-substack-provider/plan.md +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/005-substack-provider/quickstart.md +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/005-substack-provider/research.md +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/005-substack-provider/spec.md +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/005-substack-provider/tasks.md +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/006-thenewstack-provider/checklists/requirements.md +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/006-thenewstack-provider/contracts/public-api.md +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/006-thenewstack-provider/data-model.md +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/006-thenewstack-provider/plan.md +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/006-thenewstack-provider/quickstart.md +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/006-thenewstack-provider/research.md +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/006-thenewstack-provider/spec.md +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/006-thenewstack-provider/tasks.md +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/007-dzone-provider/checklists/requirements.md +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/007-dzone-provider/contracts/public-api.md +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/007-dzone-provider/data-model.md +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/007-dzone-provider/plan.md +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/007-dzone-provider/quickstart.md +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/007-dzone-provider/research.md +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/007-dzone-provider/spec.md +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/007-dzone-provider/tasks.md +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/008-mdfetch-cli/checklists/requirements.md +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/008-mdfetch-cli/contracts/cli.md +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/008-mdfetch-cli/data-model.md +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/008-mdfetch-cli/plan.md +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/008-mdfetch-cli/quickstart.md +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/008-mdfetch-cli/research.md +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/008-mdfetch-cli/spec.md +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/008-mdfetch-cli/tasks.md +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/009-homebrew-tap-formula/checklists/requirements.md +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/009-homebrew-tap-formula/contracts/formula.md +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/009-homebrew-tap-formula/contracts/tap-update-job.md +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/009-homebrew-tap-formula/data-model.md +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/009-homebrew-tap-formula/plan.md +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/009-homebrew-tap-formula/quickstart.md +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/009-homebrew-tap-formula/research.md +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/009-homebrew-tap-formula/spec.md +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/009-homebrew-tap-formula/tasks.md +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/010-boomi-blog-provider/checklists/requirements.md +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/010-boomi-blog-provider/contracts/extractor-contract.md +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/010-boomi-blog-provider/data-model.md +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/010-boomi-blog-provider/plan.md +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/010-boomi-blog-provider/quickstart.md +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/010-boomi-blog-provider/research.md +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/010-boomi-blog-provider/spec.md +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/010-boomi-blog-provider/tasks.md +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/011-konghq-blog-provider/checklists/requirements.md +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/011-konghq-blog-provider/contracts/extractor-contract.md +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/011-konghq-blog-provider/data-model.md +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/011-konghq-blog-provider/plan.md +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/011-konghq-blog-provider/quickstart.md +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/011-konghq-blog-provider/research.md +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/011-konghq-blog-provider/spec.md +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/011-konghq-blog-provider/tasks.md +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/012-list-platforms/checklists/requirements.md +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/012-list-platforms/contracts/cli.md +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/012-list-platforms/data-model.md +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/012-list-platforms/plan.md +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/012-list-platforms/quickstart.md +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/012-list-platforms/research.md +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/012-list-platforms/spec.md +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/012-list-platforms/tasks.md +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/013-tavily-fallback/checklists/requirements.md +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/013-tavily-fallback/contracts/api.md +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/013-tavily-fallback/contracts/cli.md +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/013-tavily-fallback/data-model.md +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/013-tavily-fallback/plan.md +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/013-tavily-fallback/quickstart.md +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/013-tavily-fallback/research.md +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/013-tavily-fallback/spec.md +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/013-tavily-fallback/tasks.md +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/src/mdfetch/__init__.py +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/src/mdfetch/base.py +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/src/mdfetch/cli.py +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/src/mdfetch/exceptions.py +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/src/mdfetch/providers/__init__.py +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/src/mdfetch/providers/boomi.py +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/src/mdfetch/providers/devto.py +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/src/mdfetch/providers/dzone.py +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/src/mdfetch/providers/kong.py +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/src/mdfetch/providers/medium.py +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/src/mdfetch/providers/substack.py +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/src/mdfetch/providers/thenewstack.py +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/src/mdfetch/router.py +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/tests/__init__.py +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/tests/conftest.py +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/tests/integration/__init__.py +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/tests/integration/conftest.py +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/tests/integration/snapshots/architecting-the-asynchronous-agent.md +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/tests/integration/snapshots/boomi-data-consistency-saas-on-prem.md +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/tests/integration/snapshots/boomi-gartner-magic-quadrant-ipaas-2026.md +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/tests/integration/snapshots/boomi-real-time-vs-batch-data-integration.md +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/tests/integration/snapshots/devto-integration-digest-december-2025.md +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/tests/integration/snapshots/devto-integration-digest-july-2025.md +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/tests/integration/snapshots/devto-integration-digest-march-2026.md +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/tests/integration/snapshots/dzone-image-classification-pipeline-camel-djl.md +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/tests/integration/snapshots/dzone-integration-patterns-fail-production.md +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/tests/integration/snapshots/dzone-kiro-feature-to-requirements-design-tasks.md +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/tests/integration/snapshots/from-drift-to-parity.md +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/tests/integration/snapshots/integration-digest-december-2025.md +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/tests/integration/snapshots/kong-ai-gateway-vs-litellm.md +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/tests/integration/snapshots/kong-gateway-3-14.md +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/tests/integration/snapshots/kong-insomnia-12-6.md +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/tests/integration/snapshots/substack-api-trends-2025.md +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/tests/integration/snapshots/substack-kafka-topic-types.md +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/tests/integration/snapshots/thenewstack-api-mcp-agent.md +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/tests/integration/snapshots/thenewstack-async-apis.md +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/tests/integration/snapshots/thenewstack-developer-portal-api.md +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/tests/integration/snapshots/thenewstack-json-schema-ai.md +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/tests/integration/snapshots/thenewstack-mcp-api-governance.md +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/tests/integration/test_boomi_integration.py +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/tests/integration/test_cli_integration.py +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/tests/integration/test_devto_integration.py +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/tests/integration/test_dzone_integration.py +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/tests/integration/test_fallback_integration.py +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/tests/integration/test_kong_integration.py +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/tests/integration/test_medium_integration.py +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/tests/integration/test_substack_integration.py +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/tests/integration/test_thenewstack_integration.py +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/tests/integration_log.txt +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/tests/unit/__init__.py +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/tests/unit/test_boomi_extractor.py +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/tests/unit/test_cli.py +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/tests/unit/test_devto_extractor.py +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/tests/unit/test_dzone_extractor.py +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/tests/unit/test_fetch_errors.py +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/tests/unit/test_kong_extractor.py +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/tests/unit/test_medium_extractor.py +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/tests/unit/test_router.py +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/tests/unit/test_silent.py +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/tests/unit/test_substack_extractor.py +0 -0
- {mdfetch-0.9.0 → mdfetch-0.9.2}/tests/unit/test_thenewstack_extractor.py +0 -0
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import sys
|
|
2
|
+
import json
|
|
3
|
+
import urllib.request
|
|
4
|
+
|
|
5
|
+
def generate():
|
|
6
|
+
for line in sys.stdin:
|
|
7
|
+
line = line.strip()
|
|
8
|
+
# Skip empty lines, comments, and local editable installs
|
|
9
|
+
if not line or line.startswith('#') or line.startswith('-e'):
|
|
10
|
+
continue
|
|
11
|
+
|
|
12
|
+
# Very basic environment marker filtering to skip Windows/Linux specific packages
|
|
13
|
+
if ';' in line:
|
|
14
|
+
req, marker = line.split(';', 1)
|
|
15
|
+
# Remove whitespace and quotes for simple matching
|
|
16
|
+
marker_clean = marker.replace(' ', '').replace('"', '').replace("'", "")
|
|
17
|
+
if 'sys_platform==win32' in marker_clean or 'sys_platform==linux' in marker_clean:
|
|
18
|
+
continue
|
|
19
|
+
line = req.strip()
|
|
20
|
+
|
|
21
|
+
# We only care about pinned packages
|
|
22
|
+
if '==' not in line:
|
|
23
|
+
continue
|
|
24
|
+
|
|
25
|
+
pkg, ver = line.split('==', 1)
|
|
26
|
+
pkg = pkg.strip()
|
|
27
|
+
ver = ver.strip()
|
|
28
|
+
|
|
29
|
+
# We don't need a resource block for mdfetch itself
|
|
30
|
+
if pkg == "mdfetch":
|
|
31
|
+
continue
|
|
32
|
+
|
|
33
|
+
url = f"https://pypi.org/pypi/{pkg}/{ver}/json"
|
|
34
|
+
try:
|
|
35
|
+
req = urllib.request.Request(url)
|
|
36
|
+
with urllib.request.urlopen(req, timeout=15) as resp:
|
|
37
|
+
data = json.loads(resp.read().decode('utf-8'))
|
|
38
|
+
except Exception as e:
|
|
39
|
+
print(f"ERROR: Failed fetching {pkg}: {e}", file=sys.stderr)
|
|
40
|
+
sys.exit(1)
|
|
41
|
+
|
|
42
|
+
urls = data.get("urls", [])
|
|
43
|
+
if not urls:
|
|
44
|
+
print(f"ERROR: {pkg} has no urls on PyPI", file=sys.stderr)
|
|
45
|
+
sys.exit(1)
|
|
46
|
+
|
|
47
|
+
# Require sdist (source tarball) to ensure architecture independence
|
|
48
|
+
sdist = next((u for u in urls if u["packagetype"] == "sdist"), None)
|
|
49
|
+
if not sdist:
|
|
50
|
+
print(f"ERROR: {pkg} has no sdist (source tarball) available on PyPI", file=sys.stderr)
|
|
51
|
+
sys.exit(1)
|
|
52
|
+
|
|
53
|
+
print(f' resource "{pkg}" do')
|
|
54
|
+
print(f' url "{sdist["url"]}"')
|
|
55
|
+
print(f' sha256 "{sdist["digests"]["sha256"]}"')
|
|
56
|
+
print(f' end\n')
|
|
57
|
+
|
|
58
|
+
if __name__ == "__main__":
|
|
59
|
+
generate()
|
|
@@ -65,6 +65,14 @@ jobs:
|
|
|
65
65
|
contents: read
|
|
66
66
|
|
|
67
67
|
steps:
|
|
68
|
+
- uses: actions/checkout@v4
|
|
69
|
+
|
|
70
|
+
- name: Install uv
|
|
71
|
+
uses: astral-sh/setup-uv@v4
|
|
72
|
+
|
|
73
|
+
- name: Set up Python
|
|
74
|
+
run: uv python pin 3.12
|
|
75
|
+
|
|
68
76
|
- name: Fetch sdist info from PyPI (with retry)
|
|
69
77
|
env:
|
|
70
78
|
VERSION: ${{ github.ref_name }}
|
|
@@ -94,6 +102,10 @@ jobs:
|
|
|
94
102
|
echo "SHA256=${SHA256}" >> "$GITHUB_ENV"
|
|
95
103
|
echo "VERSION=${VERSION}" >> "$GITHUB_ENV"
|
|
96
104
|
|
|
105
|
+
- name: Generate PyPI resource blocks
|
|
106
|
+
run: |
|
|
107
|
+
uv export --no-dev --no-hashes --format requirements-txt | python3 .github/scripts/generate_resources.py > /tmp/resources.rb
|
|
108
|
+
|
|
97
109
|
- name: Clone homebrew-tap and update formula
|
|
98
110
|
env:
|
|
99
111
|
TAP_GITHUB_TOKEN: ${{ secrets.TAP_GITHUB_TOKEN }}
|
|
@@ -114,7 +126,15 @@ jobs:
|
|
|
114
126
|
echo "ERROR: SHA256 substitution made no change — formula sha256 pattern may have drifted" >&2; exit 1
|
|
115
127
|
fi
|
|
116
128
|
|
|
129
|
+
# Replace everything between uses_from_macos "libxslt" and def install with the new resources
|
|
130
|
+
awk '
|
|
131
|
+
/uses_from_macos "libxslt"/ { print; print ""; system("cat /tmp/resources.rb"); skip=1; next }
|
|
132
|
+
/def install/ { skip=0 }
|
|
133
|
+
!skip { print }
|
|
134
|
+
' Formula/md-fetch.rb > Formula/md-fetch.rb.new
|
|
135
|
+
mv Formula/md-fetch.rb.new Formula/md-fetch.rb
|
|
136
|
+
|
|
117
137
|
git add Formula/md-fetch.rb
|
|
118
|
-
git commit -m "chore: bump md-fetch to v${VERSION}"
|
|
138
|
+
git commit -m "chore: bump md-fetch to v${VERSION} and sync resources"
|
|
119
139
|
git pull --rebase
|
|
120
140
|
git push
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: mdfetch
|
|
3
|
-
Version: 0.9.
|
|
3
|
+
Version: 0.9.2
|
|
4
4
|
Summary: Extract article content from web platforms and return it as clean Markdown.
|
|
5
5
|
Project-URL: Homepage, https://github.com/stn1slv/md-fetch
|
|
6
6
|
Project-URL: Source, https://github.com/stn1slv/md-fetch
|
|
@@ -2,13 +2,19 @@
|
|
|
2
2
|
|
|
3
3
|
from __future__ import annotations
|
|
4
4
|
|
|
5
|
-
from tavily import TavilyClient # type: ignore[import-untyped]
|
|
6
|
-
|
|
7
5
|
from mdfetch.exceptions import EmptyContentError, FetchError, MissingAPIKeyError
|
|
8
6
|
|
|
9
7
|
|
|
10
8
|
def tavily_extract(url: str, timeout: float = 30.0) -> str:
|
|
11
9
|
"""Extract content using the Tavily API fallback."""
|
|
10
|
+
try:
|
|
11
|
+
from tavily import TavilyClient # type: ignore[import-untyped]
|
|
12
|
+
except ImportError as e:
|
|
13
|
+
raise MissingAPIKeyError(
|
|
14
|
+
"tavily-python package is not installed. Please install it "
|
|
15
|
+
f"to use the fallback feature. {e}"
|
|
16
|
+
) from e
|
|
17
|
+
|
|
12
18
|
try:
|
|
13
19
|
client = TavilyClient()
|
|
14
20
|
except Exception as e:
|
|
@@ -12,7 +12,7 @@ from mdfetch.fallback import tavily_extract
|
|
|
12
12
|
|
|
13
13
|
|
|
14
14
|
class TestTavilyExtract:
|
|
15
|
-
@patch("
|
|
15
|
+
@patch("tavily.TavilyClient")
|
|
16
16
|
def test_basic_depth_success(self, mock_tavily_client: MagicMock) -> None:
|
|
17
17
|
mock_instance = mock_tavily_client.return_value
|
|
18
18
|
mock_instance.extract.return_value = {"results": [{"raw_content": "# Hello"}]}
|
|
@@ -24,7 +24,7 @@ class TestTavilyExtract:
|
|
|
24
24
|
urls=["https://example.com"], extract_depth="basic"
|
|
25
25
|
)
|
|
26
26
|
|
|
27
|
-
@patch("
|
|
27
|
+
@patch("tavily.TavilyClient")
|
|
28
28
|
def test_fallback_to_advanced_on_empty(self, mock_tavily_client: MagicMock) -> None:
|
|
29
29
|
mock_instance = mock_tavily_client.return_value
|
|
30
30
|
# First call fails (empty), second call succeeds
|
|
@@ -41,7 +41,7 @@ class TestTavilyExtract:
|
|
|
41
41
|
urls=["https://example.com"], extract_depth="advanced"
|
|
42
42
|
)
|
|
43
43
|
|
|
44
|
-
@patch("
|
|
44
|
+
@patch("tavily.TavilyClient")
|
|
45
45
|
def test_fallback_to_advanced_on_exception(self, mock_tavily_client: MagicMock) -> None:
|
|
46
46
|
mock_instance = mock_tavily_client.return_value
|
|
47
47
|
# First call raises exception, second call succeeds
|
|
@@ -55,7 +55,7 @@ class TestTavilyExtract:
|
|
|
55
55
|
assert result == "# Advanced"
|
|
56
56
|
assert mock_instance.extract.call_count == 2
|
|
57
57
|
|
|
58
|
-
@patch("
|
|
58
|
+
@patch("tavily.TavilyClient")
|
|
59
59
|
def test_advanced_failure_raises_fetch_error(self, mock_tavily_client: MagicMock) -> None:
|
|
60
60
|
mock_instance = mock_tavily_client.return_value
|
|
61
61
|
mock_instance.extract.side_effect = Exception("API Error")
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{mdfetch-0.9.0 → mdfetch-0.9.2}/.specify/extensions/git/scripts/powershell/create-new-feature.ps1
RENAMED
|
File without changes
|
|
File without changes
|
{mdfetch-0.9.0 → mdfetch-0.9.2}/.specify/extensions/git/scripts/powershell/initialize-repo.ps1
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{mdfetch-0.9.0 → mdfetch-0.9.2}/specs/001-mdfetch-medium-extractor/checklists/requirements.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{mdfetch-0.9.0 → mdfetch-0.9.2}/specs/003-medium-freedium-fallback/checklists/requirements.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|