# spec-check
[](https://github.com/TradeMe/spec-check/actions)
[](https://www.python.org/downloads/)
Tools for spec-driven development - a toolkit for managing and validating project specifications and files.
## Features
### Lint Tool
The `lint` tool validates that all files in your repository match patterns in an allowlist. Think of it as the inverse of `.gitignore` - instead of specifying what to ignore, you specify what files are allowed.
Key features:
- Uses gitignore-style glob patterns for flexible file matching
- Respects `.gitignore` patterns by default
- Supports complex patterns including character classes (e.g., `[0-9]`)
- Validates that all tracked files match at least one allowlist pattern
- Reports unmatched files for easy identification
### Markdown Link Validator
The `check-links` tool validates hyperlinks in markdown files to ensure documentation stays up-to-date and accessible.
Key features:
- Validates internal links (relative paths) resolve correctly
- Checks anchor links point to existing headings
- Validates external URLs are accessible
- Supports private URL patterns that are skipped during validation
- Concurrent external URL checking for performance
- Respects `.gitignore` patterns by default
### Spec Coverage Validator
The `check-coverage` tool ensures 100% traceability between specification requirements and tests.
Key features:
- Extracts requirement IDs from spec files (e.g., REQ-001, NFR-001)
- Validates every requirement has at least one corresponding test
- Reports coverage percentage and uncovered requirements
- Uses pytest markers for machine-readable test-to-requirement linking
- Identifies tests without requirement markers
### Structure Validator
The `check-structure` tool enforces consistent spec-to-test structure alignment.
Key features:
- Verifies each spec file has a corresponding test file or directory
- Supports flexible naming conventions (kebab-case to snake_case)
- Allows unit tests without corresponding specs
- Reports specs without tests
- Ensures consistent project organization
## Installation
### Using uv (recommended)
```bash
uv pip install spec-check
```
### Using pip
```bash
pip install spec-check
```
### Development installation
```bash
# Clone the repository
git clone https://github.com/TradeMe/spec-check.git
cd spec-check
# Install with uv
uv venv
uv pip install -e ".[dev]"
```
## Configuration
spec-check can be configured via `pyproject.toml` for seamless integration with Python projects. This allows you to set default options without needing to pass command-line arguments every time.
### pyproject.toml Configuration
Add a `[tool.spec-check]` section to your `pyproject.toml`:
```toml
[tool.spec-check.lint]
allowlist = ".specallowlist"
use_gitignore = true
[tool.spec-check.check-links]
config = ".speclinkconfig"
timeout = 15
max_concurrent = 5
check_external = true
use_gitignore = true
[tool.spec-check.check-schema]
config = ".specschemaconfig"
use_gitignore = true
```
### Configuration Options
#### Lint Command (`[tool.spec-check.lint]`)
- `allowlist` (string): Path to allowlist file (default: `.specallowlist`)
- `use_gitignore` (boolean): Respect .gitignore patterns (default: `true`)
#### Check Links Command (`[tool.spec-check.check-links]`)
- `config` (string): Path to config file for private URLs (default: `.speclinkconfig`)
- `timeout` (integer): Timeout for external URL requests in seconds (default: `10`)
- `max_concurrent` (integer): Maximum concurrent external URL requests (default: `10`)
- `check_external` (boolean): Validate external URLs (default: `true`)
- `use_gitignore` (boolean): Respect .gitignore patterns (default: `true`)
#### Check Schema Command (`[tool.spec-check.check-schema]`)
- `config` (string): Path to schema config file (default: `.specschemaconfig`)
- `use_gitignore` (boolean): Respect .gitignore patterns (default: `true`)
### Configuration Precedence
Configuration values are resolved in the following order (highest to lowest precedence):
1. **Command-line arguments** (e.g., `--timeout 30`)
2. **pyproject.toml configuration** (e.g., `timeout = 15` in `[tool.spec-check.check-links]`)
3. **Built-in defaults**
This means you can set project defaults in `pyproject.toml` and override them on the command line when needed.
## Usage
### Lint Command
Create a `.specallowlist` file in your project root with gitignore-style patterns:
```
# Documentation
*.md
docs/**/*.rst
# Source code
spec_check/**/*.py
tests/**/*.py
# Configuration files
*.toml
*.yaml
*.yml
# Specs with specific naming convention
specs/research-[0-9][0-9][0-9]-*.md
specs/design-*.md
```
Then run the linter:
```bash
# Lint the current directory
spec-check lint
# Lint a specific directory
spec-check lint /path/to/project
# Use a custom allowlist file
spec-check lint --allowlist .myallowlist
# Don't respect .gitignore patterns
spec-check lint --no-gitignore
# Verbose output
spec-check lint --verbose
```
### Exit Codes
- `0`: All files match the allowlist patterns
- `1`: Some files don't match or an error occurred
This makes it easy to integrate into CI/CD pipelines:
```yaml
# .github/workflows/ci.yml
- name: Validate file allowlist
run: spec-check lint
```
### Check Links Command
Validate all hyperlinks in your markdown documentation:
```bash
# Check links in current directory
spec-check check-links
# Check links in a specific directory
spec-check check-links /path/to/docs
# Skip external URL validation (faster)
spec-check check-links --no-external
# Use a custom config file for private URLs
spec-check check-links --config .myconfigfile
# Set timeout for external URLs (default: 10 seconds)
spec-check check-links --timeout 30
# Limit concurrent requests (default: 10)
spec-check check-links --max-concurrent 5
# Verbose output
spec-check check-links --verbose
```
#### Private URL Configuration
Create a `.speclinkconfig` file to specify private URL patterns that should not be validated:
```
# Private domains (will skip any URL containing these domains)
internal.company.com
localhost
# Private URL prefixes (exact prefix match)
https://private.example.com/
http://localhost:
http://127.0.0.1:
```
#### What Gets Validated
- **Internal links**: `[text](./file.md)` - checked relative to the markdown file
- **Anchor links**: `[text](#heading)` - validated against headings in the file
- **Cross-file anchors**: `[text](./other.md#section)` - validates both file and heading
- **External URLs**: `[text](https://example.com)` - HTTP request to verify accessibility
- **Private URLs**: URLs matching configured patterns are skipped
#### CI/CD Integration
```yaml
# .github/workflows/ci.yml
- name: Validate documentation links
run: spec-check check-links --no-external # Skip external URLs in CI
```
### Check Coverage Command
Ensure all spec requirements have corresponding tests:
```bash
# Check coverage in current directory
spec-check check-coverage
# Check coverage in a specific directory
spec-check check-coverage /path/to/project
# Use custom specs and tests directories
spec-check check-coverage --specs-dir my-specs --tests-dir my-tests
```
#### Marking Tests with Requirements
Use pytest markers to link tests to requirements:
```python
import pytest
@pytest.mark.req("REQ-001")
def test_inline_link_parsing():
"""Test that inline links are parsed correctly."""
# Test implementation
assert True
# For tests covering multiple requirements:
@pytest.mark.req("REQ-002", "REQ-003")
def test_reference_style_links():
"""Test reference-style link parsing."""
# Test implementation
assert True
```
#### CI/CD Integration
```yaml
# .github/workflows/ci.yml
- name: Validate spec coverage
run: spec-check check-coverage
```
### Check Structure Command
Validate spec-to-test structure alignment:
```bash
# Check structure in current directory
spec-check check-structure
# Check structure in a specific directory
spec-check check-structure /path/to/project
# Use custom specs and tests directories
spec-check check-structure --specs-dir my-specs --tests-dir my-tests
```
#### Structure Conventions
For a spec file `specs/feature-name.md`, the tool expects either:
- `tests/test_feature_name.py` (single test file)
- `tests/feature_name/` (test directory)
This allows unit tests without corresponding specs while ensuring all specs have requirement tests.
#### CI/CD Integration
```yaml
# .github/workflows/ci.yml
- name: Validate spec structure
run: spec-check check-structure
```
## Pattern Syntax
The allowlist uses gitignore-style glob patterns:
- `*` - matches any number of characters (except `/`)
- `**` - matches any number of directories
- `?` - matches a single character
- `[abc]` - matches one character in the set
- `[0-9]` - matches one character in the range
- `!pattern` - negates a pattern (matches files that don't match the pattern)
### Examples
```
# Match all Python files
*.py
# Match Python files in src directory and subdirectories
src/**/*.py
# Match numbered specification files
specs/spec-[0-9][0-9][0-9].md
# Match files with specific naming pattern
docs/architecture-*.md
docs/design-*.md
# Match multiple file types
*.{yml,yaml}
```
## Use Cases
1. **Enforce file organization**: Ensure all files follow your project's structure
2. **Validate spec compliance**: Make sure all files match expected patterns
3. **CI/CD validation**: Automatically check that no unexpected files are committed
4. **Documentation enforcement**: Ensure all code files have matching documentation
5. **Naming convention enforcement**: Validate files follow naming standards
6. **Test-to-requirement traceability**: Guarantee 100% requirement coverage with automated validation
7. **Spec-driven development**: Enforce consistent spec-to-test structure for better maintainability
8. **Documentation quality**: Ensure all links in documentation are valid and up-to-date
## Example: Research Paper Repository
```
# .specallowlist
# Papers must follow naming: research-NNN-title.md
papers/research-[0-9][0-9][0-9]-*.md
# Supporting data files
papers/data-[0-9][0-9][0-9]-*.csv
papers/figures-[0-9][0-9][0-9]-*.{png,jpg,svg}
# Project files
*.md
LICENSE
.gitignore
.specallowlist
```
## Development
### Running Tests
```bash
# Activate virtual environment
source .venv/bin/activate
# Run tests
pytest tests/ -v
# Run tests with coverage
pytest tests/ -v --cov=spec_check --cov-report=term-missing
```
### Linting
```bash
# Check code with ruff
ruff check spec_check/ tests/
# Format code with ruff
ruff format spec_check/ tests/
```
### Building
```bash
# Build with flit
uv pip install flit
flit build
```
## Roadmap
Future tools planned for spec-check:
- **spec-graph**: Visualize dependencies between spec files
- **spec-init**: Initialize new spec-driven projects
- **spec-sync**: Keep specs in sync with implementation
- **spec-extract**: Extract requirements from code comments into spec files
## Contributing
Contributions are welcome! Please feel free to submit a Pull Request.
## License
MIT License - see LICENSE file for details.
Raw data
{
"_id": null,
"home_page": null,
"name": "spec-check",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.10",
"maintainer_email": null,
"keywords": "spec, specification, testing, validation, linting, documentation, traceability, requirements, test-coverage, markdown",
"author": "spec-check contributors",
"author_email": null,
"download_url": "https://files.pythonhosted.org/packages/b4/f4/9a17aa1d15fca79f3c702897e01eee41e367666bf563f9b85a38c2ffe460/spec_check-0.1.4.tar.gz",
"platform": null,
"description": "# spec-check\n\n[](https://github.com/TradeMe/spec-check/actions)\n[](https://www.python.org/downloads/)\n\nTools for spec-driven development - a toolkit for managing and validating project specifications and files.\n\n## Features\n\n### Lint Tool\n\nThe `lint` tool validates that all files in your repository match patterns in an allowlist. Think of it as the inverse of `.gitignore` - instead of specifying what to ignore, you specify what files are allowed.\n\nKey features:\n- Uses gitignore-style glob patterns for flexible file matching\n- Respects `.gitignore` patterns by default\n- Supports complex patterns including character classes (e.g., `[0-9]`)\n- Validates that all tracked files match at least one allowlist pattern\n- Reports unmatched files for easy identification\n\n### Markdown Link Validator\n\nThe `check-links` tool validates hyperlinks in markdown files to ensure documentation stays up-to-date and accessible.\n\nKey features:\n- Validates internal links (relative paths) resolve correctly\n- Checks anchor links point to existing headings\n- Validates external URLs are accessible\n- Supports private URL patterns that are skipped during validation\n- Concurrent external URL checking for performance\n- Respects `.gitignore` patterns by default\n\n### Spec Coverage Validator\n\nThe `check-coverage` tool ensures 100% traceability between specification requirements and tests.\n\nKey features:\n- Extracts requirement IDs from spec files (e.g., REQ-001, NFR-001)\n- Validates every requirement has at least one corresponding test\n- Reports coverage percentage and uncovered requirements\n- Uses pytest markers for machine-readable test-to-requirement linking\n- Identifies tests without requirement markers\n\n### Structure Validator\n\nThe `check-structure` tool enforces consistent spec-to-test structure alignment.\n\nKey features:\n- Verifies each spec file has a corresponding test file or directory\n- Supports flexible naming conventions (kebab-case to snake_case)\n- Allows unit tests without corresponding specs\n- Reports specs without tests\n- Ensures consistent project organization\n\n## Installation\n\n### Using uv (recommended)\n\n```bash\nuv pip install spec-check\n```\n\n### Using pip\n\n```bash\npip install spec-check\n```\n\n### Development installation\n\n```bash\n# Clone the repository\ngit clone https://github.com/TradeMe/spec-check.git\ncd spec-check\n\n# Install with uv\nuv venv\nuv pip install -e \".[dev]\"\n```\n\n## Configuration\n\nspec-check can be configured via `pyproject.toml` for seamless integration with Python projects. This allows you to set default options without needing to pass command-line arguments every time.\n\n### pyproject.toml Configuration\n\nAdd a `[tool.spec-check]` section to your `pyproject.toml`:\n\n```toml\n[tool.spec-check.lint]\nallowlist = \".specallowlist\"\nuse_gitignore = true\n\n[tool.spec-check.check-links]\nconfig = \".speclinkconfig\"\ntimeout = 15\nmax_concurrent = 5\ncheck_external = true\nuse_gitignore = true\n\n[tool.spec-check.check-schema]\nconfig = \".specschemaconfig\"\nuse_gitignore = true\n```\n\n### Configuration Options\n\n#### Lint Command (`[tool.spec-check.lint]`)\n- `allowlist` (string): Path to allowlist file (default: `.specallowlist`)\n- `use_gitignore` (boolean): Respect .gitignore patterns (default: `true`)\n\n#### Check Links Command (`[tool.spec-check.check-links]`)\n- `config` (string): Path to config file for private URLs (default: `.speclinkconfig`)\n- `timeout` (integer): Timeout for external URL requests in seconds (default: `10`)\n- `max_concurrent` (integer): Maximum concurrent external URL requests (default: `10`)\n- `check_external` (boolean): Validate external URLs (default: `true`)\n- `use_gitignore` (boolean): Respect .gitignore patterns (default: `true`)\n\n#### Check Schema Command (`[tool.spec-check.check-schema]`)\n- `config` (string): Path to schema config file (default: `.specschemaconfig`)\n- `use_gitignore` (boolean): Respect .gitignore patterns (default: `true`)\n\n### Configuration Precedence\n\nConfiguration values are resolved in the following order (highest to lowest precedence):\n\n1. **Command-line arguments** (e.g., `--timeout 30`)\n2. **pyproject.toml configuration** (e.g., `timeout = 15` in `[tool.spec-check.check-links]`)\n3. **Built-in defaults**\n\nThis means you can set project defaults in `pyproject.toml` and override them on the command line when needed.\n\n## Usage\n\n### Lint Command\n\nCreate a `.specallowlist` file in your project root with gitignore-style patterns:\n\n```\n# Documentation\n*.md\ndocs/**/*.rst\n\n# Source code\nspec_check/**/*.py\ntests/**/*.py\n\n# Configuration files\n*.toml\n*.yaml\n*.yml\n\n# Specs with specific naming convention\nspecs/research-[0-9][0-9][0-9]-*.md\nspecs/design-*.md\n```\n\nThen run the linter:\n\n```bash\n# Lint the current directory\nspec-check lint\n\n# Lint a specific directory\nspec-check lint /path/to/project\n\n# Use a custom allowlist file\nspec-check lint --allowlist .myallowlist\n\n# Don't respect .gitignore patterns\nspec-check lint --no-gitignore\n\n# Verbose output\nspec-check lint --verbose\n```\n\n### Exit Codes\n\n- `0`: All files match the allowlist patterns\n- `1`: Some files don't match or an error occurred\n\nThis makes it easy to integrate into CI/CD pipelines:\n\n```yaml\n# .github/workflows/ci.yml\n- name: Validate file allowlist\n run: spec-check lint\n```\n\n### Check Links Command\n\nValidate all hyperlinks in your markdown documentation:\n\n```bash\n# Check links in current directory\nspec-check check-links\n\n# Check links in a specific directory\nspec-check check-links /path/to/docs\n\n# Skip external URL validation (faster)\nspec-check check-links --no-external\n\n# Use a custom config file for private URLs\nspec-check check-links --config .myconfigfile\n\n# Set timeout for external URLs (default: 10 seconds)\nspec-check check-links --timeout 30\n\n# Limit concurrent requests (default: 10)\nspec-check check-links --max-concurrent 5\n\n# Verbose output\nspec-check check-links --verbose\n```\n\n#### Private URL Configuration\n\nCreate a `.speclinkconfig` file to specify private URL patterns that should not be validated:\n\n```\n# Private domains (will skip any URL containing these domains)\ninternal.company.com\nlocalhost\n\n# Private URL prefixes (exact prefix match)\nhttps://private.example.com/\nhttp://localhost:\nhttp://127.0.0.1:\n```\n\n#### What Gets Validated\n\n- **Internal links**: `[text](./file.md)` - checked relative to the markdown file\n- **Anchor links**: `[text](#heading)` - validated against headings in the file\n- **Cross-file anchors**: `[text](./other.md#section)` - validates both file and heading\n- **External URLs**: `[text](https://example.com)` - HTTP request to verify accessibility\n- **Private URLs**: URLs matching configured patterns are skipped\n\n#### CI/CD Integration\n\n```yaml\n# .github/workflows/ci.yml\n- name: Validate documentation links\n run: spec-check check-links --no-external # Skip external URLs in CI\n```\n\n### Check Coverage Command\n\nEnsure all spec requirements have corresponding tests:\n\n```bash\n# Check coverage in current directory\nspec-check check-coverage\n\n# Check coverage in a specific directory\nspec-check check-coverage /path/to/project\n\n# Use custom specs and tests directories\nspec-check check-coverage --specs-dir my-specs --tests-dir my-tests\n```\n\n#### Marking Tests with Requirements\n\nUse pytest markers to link tests to requirements:\n\n```python\nimport pytest\n\n@pytest.mark.req(\"REQ-001\")\ndef test_inline_link_parsing():\n \"\"\"Test that inline links are parsed correctly.\"\"\"\n # Test implementation\n assert True\n\n# For tests covering multiple requirements:\n@pytest.mark.req(\"REQ-002\", \"REQ-003\")\ndef test_reference_style_links():\n \"\"\"Test reference-style link parsing.\"\"\"\n # Test implementation\n assert True\n```\n\n#### CI/CD Integration\n\n```yaml\n# .github/workflows/ci.yml\n- name: Validate spec coverage\n run: spec-check check-coverage\n```\n\n### Check Structure Command\n\nValidate spec-to-test structure alignment:\n\n```bash\n# Check structure in current directory\nspec-check check-structure\n\n# Check structure in a specific directory\nspec-check check-structure /path/to/project\n\n# Use custom specs and tests directories\nspec-check check-structure --specs-dir my-specs --tests-dir my-tests\n```\n\n#### Structure Conventions\n\nFor a spec file `specs/feature-name.md`, the tool expects either:\n- `tests/test_feature_name.py` (single test file)\n- `tests/feature_name/` (test directory)\n\nThis allows unit tests without corresponding specs while ensuring all specs have requirement tests.\n\n#### CI/CD Integration\n\n```yaml\n# .github/workflows/ci.yml\n- name: Validate spec structure\n run: spec-check check-structure\n```\n\n## Pattern Syntax\n\nThe allowlist uses gitignore-style glob patterns:\n\n- `*` - matches any number of characters (except `/`)\n- `**` - matches any number of directories\n- `?` - matches a single character\n- `[abc]` - matches one character in the set\n- `[0-9]` - matches one character in the range\n- `!pattern` - negates a pattern (matches files that don't match the pattern)\n\n### Examples\n\n```\n# Match all Python files\n*.py\n\n# Match Python files in src directory and subdirectories\nsrc/**/*.py\n\n# Match numbered specification files\nspecs/spec-[0-9][0-9][0-9].md\n\n# Match files with specific naming pattern\ndocs/architecture-*.md\ndocs/design-*.md\n\n# Match multiple file types\n*.{yml,yaml}\n```\n\n## Use Cases\n\n1. **Enforce file organization**: Ensure all files follow your project's structure\n2. **Validate spec compliance**: Make sure all files match expected patterns\n3. **CI/CD validation**: Automatically check that no unexpected files are committed\n4. **Documentation enforcement**: Ensure all code files have matching documentation\n5. **Naming convention enforcement**: Validate files follow naming standards\n6. **Test-to-requirement traceability**: Guarantee 100% requirement coverage with automated validation\n7. **Spec-driven development**: Enforce consistent spec-to-test structure for better maintainability\n8. **Documentation quality**: Ensure all links in documentation are valid and up-to-date\n\n## Example: Research Paper Repository\n\n```\n# .specallowlist\n# Papers must follow naming: research-NNN-title.md\npapers/research-[0-9][0-9][0-9]-*.md\n\n# Supporting data files\npapers/data-[0-9][0-9][0-9]-*.csv\npapers/figures-[0-9][0-9][0-9]-*.{png,jpg,svg}\n\n# Project files\n*.md\nLICENSE\n.gitignore\n.specallowlist\n```\n\n## Development\n\n### Running Tests\n\n```bash\n# Activate virtual environment\nsource .venv/bin/activate\n\n# Run tests\npytest tests/ -v\n\n# Run tests with coverage\npytest tests/ -v --cov=spec_check --cov-report=term-missing\n```\n\n### Linting\n\n```bash\n# Check code with ruff\nruff check spec_check/ tests/\n\n# Format code with ruff\nruff format spec_check/ tests/\n```\n\n### Building\n\n```bash\n# Build with flit\nuv pip install flit\nflit build\n```\n\n## Roadmap\n\nFuture tools planned for spec-check:\n\n- **spec-graph**: Visualize dependencies between spec files\n- **spec-init**: Initialize new spec-driven projects\n- **spec-sync**: Keep specs in sync with implementation\n- **spec-extract**: Extract requirements from code comments into spec files\n\n## Contributing\n\nContributions are welcome! Please feel free to submit a Pull Request.\n\n## License\n\nMIT License - see LICENSE file for details.\n\n",
"bugtrack_url": null,
"license": null,
"summary": "Tools for spec-driven development - validate specifications, test coverage, file structure, and documentation links",
"version": "0.1.4",
"project_urls": {
"Changelog": "https://github.com/TradeMe/spec-check/releases",
"Homepage": "https://github.com/TradeMe/spec-check",
"Issues": "https://github.com/TradeMe/spec-check/issues",
"Repository": "https://github.com/TradeMe/spec-check"
},
"split_keywords": [
"spec",
" specification",
" testing",
" validation",
" linting",
" documentation",
" traceability",
" requirements",
" test-coverage",
" markdown"
],
"urls": [
{
"comment_text": null,
"digests": {
"blake2b_256": "a92ffe894f691d63d777de68d18fa16849a7a5a403774545db9fe41929a3ed4d",
"md5": "0181db703e1f5db80eb8baf8c8247432",
"sha256": "7b266efcbdc3a201e1a339cde9387a6aeb61a0025e107e43f3ee1b5805d896fe"
},
"downloads": -1,
"filename": "spec_check-0.1.4-py3-none-any.whl",
"has_sig": false,
"md5_digest": "0181db703e1f5db80eb8baf8c8247432",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.10",
"size": 63289,
"upload_time": "2025-10-30T03:29:30",
"upload_time_iso_8601": "2025-10-30T03:29:30.475458Z",
"url": "https://files.pythonhosted.org/packages/a9/2f/fe894f691d63d777de68d18fa16849a7a5a403774545db9fe41929a3ed4d/spec_check-0.1.4-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "b4f49a17aa1d15fca79f3c702897e01eee41e367666bf563f9b85a38c2ffe460",
"md5": "372029c64094aa348a8940b20b298a65",
"sha256": "8d8e4cee99a678518a6b93d446a69d0acd261e35daf4a70adf7150f1164d1f14"
},
"downloads": -1,
"filename": "spec_check-0.1.4.tar.gz",
"has_sig": false,
"md5_digest": "372029c64094aa348a8940b20b298a65",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.10",
"size": 220879,
"upload_time": "2025-10-30T03:29:32",
"upload_time_iso_8601": "2025-10-30T03:29:32.224318Z",
"url": "https://files.pythonhosted.org/packages/b4/f4/9a17aa1d15fca79f3c702897e01eee41e367666bf563f9b85a38c2ffe460/spec_check-0.1.4.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-10-30 03:29:32",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "TradeMe",
"github_project": "spec-check",
"travis_ci": false,
"coveralls": false,
"github_actions": true,
"lcname": "spec-check"
}