All notable changes to the Python package will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
- Rebrand: aipartnerup → aiperceivable
- Release script version check now supports dynamic versions via
importlib.metadata(not just static__version__ = "x.x.x") - Added hint message suggesting
pip install -e .when version mismatch is detected
- Custom charset support via shared JSON definition files (
shared/charsets/) load_charset(name_or_path)— load a bundled preset (e.g.chinese) or custom JSON fileresolve_charsets(charset_names, charset_files)— merge base + extra charsets with deduplication- Bundled charset presets:
base,chinese,japanese,korean - CLI
--charsetflag (repeatable) to enable preset charsets - CLI
--charset-fileflag (repeatable) to load custom charset JSON files APDEV_EXTRA_CHARSenvironment variable — comma-separated charset names or file paths, used as fallback when no CLI args providedcheck-chars: Block Elements (U+2580-U+259F) and Braille Patterns (U+2800-U+28FF) to default allowed ranges
- Character ranges and dangerous codepoints now loaded from
charsets/base.jsoninstead of hardcoded constants check_file()andcheck_paths()accept optionalextra_rangesanddangerouskwargs for custom charset supportis_allowed_char()now excludes dangerous codepoints (Trojan Source vectors) even though they fall within the General Punctuation allowed range
is_allowed_char()previously returnedTruefor dangerous codepoints (U+200B, U+202E, etc.) because they fall within the General Punctuation range (U+2000-U+206F)load_charset()now catches all exceptions fromimportlib.resources(not justFileNotFoundError)check_file()now uses lazy-loaded cache instead of re-parsingbase.jsonon every call
check-chars: Dangerous character blacklist (bidi controls + zero-width chars, CVE-2021-42574) with comment-aware detection — flags in code, allows in commentscheck-chars:is_dangerous_char()public function andDANGEROUS_CODEPOINTSconstantcheck-chars: Comment region detection state machine for Python (#) and JS/TS (//,/* */) with string literal trackingcheck-imports: Relative import support —from .foo import xandfrom . import foonow resolve correctly for cycle detection
check-imports:ImportAnalyzernow handlesnode.level > 0(relative imports) by resolving againstcurrent_modulewith correct package vs module distinction
- Use language-prefixed git tags (
python/v0.1.5) to support monorepo with independent package versions - URL-encode tag in GitHub API calls to handle
/in tag names
- Fix release script version check to use
PACKAGE_NAMEwhen reading init.py
- Add
PACKAGE_NAMEdefault (project name with hyphens converted to underscores) for release script
- Fix PyPI version check false positives: use exact match instead of
grep -wto prevent partial version matching (e.g.0.2.0matching0.2.0.1) - Fix
sedRE error on macOS when detecting GitHub repo from git remote (BSD sed doesn't support non-greedy.+?)
- Add
build>=1.0as a project dependency for package building support
check-chars- Validate files contain only allowed characters (ASCII, emoji, technical symbols)check-imports- Detect circular imports in a Python package with configurable--packageand--src-dir- Unified CLI entry point:
apdev <command> - Configuration support via
[tool.apdev]in consumer'spyproject.toml - Pre-commit hook definitions for
check-charsandcheck-imports apdev release- Interactive release automation (auto-detects project name and GitHub repo)python -m apdevsupport