cellpycore 0.1.2__tar.gz → 0.1.3__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.
- cellpycore-0.1.3/.cursor/rules/graphify.mdc +11 -0
- {cellpycore-0.1.2 → cellpycore-0.1.3}/.cursor/rules/issueflow-rules.mdc +5 -1
- {cellpycore-0.1.2 → cellpycore-0.1.3}/.cursor/skills/iflow-close/SKILL.md +10 -4
- {cellpycore-0.1.2 → cellpycore-0.1.3}/.cursor/skills/iflow-pick/SKILL.md +5 -1
- {cellpycore-0.1.2 → cellpycore-0.1.3}/.cursor/skills/iflow-yolo/SKILL.md +5 -4
- {cellpycore-0.1.2 → cellpycore-0.1.3}/.gitignore +5 -1
- cellpycore-0.1.3/.issueflows/03-solved-issues/issue62_original.md +13 -0
- cellpycore-0.1.3/.issueflows/03-solved-issues/issue62_plan.md +22 -0
- cellpycore-0.1.3/.issueflows/03-solved-issues/issue62_status.md +14 -0
- cellpycore-0.1.3/.issueflows/03-solved-issues/issue64_original.md +7 -0
- cellpycore-0.1.3/.issueflows/03-solved-issues/issue64_plan.md +28 -0
- cellpycore-0.1.3/.issueflows/03-solved-issues/issue64_status.md +17 -0
- cellpycore-0.1.3/.issueflows/03-solved-issues/issue66_original.md +9 -0
- cellpycore-0.1.3/.issueflows/03-solved-issues/issue66_plan.md +140 -0
- cellpycore-0.1.3/.issueflows/03-solved-issues/issue66_status.md +42 -0
- cellpycore-0.1.3/.issueflows/03-solved-issues/issue67_original.md +15 -0
- cellpycore-0.1.3/.issueflows/03-solved-issues/issue67_plan.md +114 -0
- cellpycore-0.1.3/.issueflows/03-solved-issues/issue67_status.md +19 -0
- cellpycore-0.1.3/.issueflows/03-solved-issues/issue68_original.md +13 -0
- cellpycore-0.1.3/.issueflows/03-solved-issues/issue68_plan.md +90 -0
- cellpycore-0.1.3/.issueflows/03-solved-issues/issue68_status.md +16 -0
- cellpycore-0.1.3/.issueflows/03-solved-issues/issue69_original.md +11 -0
- cellpycore-0.1.3/.issueflows/03-solved-issues/issue69_plan.md +22 -0
- cellpycore-0.1.3/.issueflows/03-solved-issues/issue69_status.md +14 -0
- cellpycore-0.1.3/.issueflows/03-solved-issues/issue70_original.md +15 -0
- cellpycore-0.1.3/.issueflows/03-solved-issues/issue70_plan.md +127 -0
- cellpycore-0.1.3/.issueflows/03-solved-issues/issue70_status.md +15 -0
- cellpycore-0.1.3/.issueflows/03-solved-issues/issue72_original.md +9 -0
- cellpycore-0.1.3/.issueflows/03-solved-issues/issue72_status.md +9 -0
- cellpycore-0.1.3/.issueflows/03-solved-issues/issue77_original.md +13 -0
- cellpycore-0.1.3/.issueflows/03-solved-issues/issue77_plan.md +176 -0
- cellpycore-0.1.3/.issueflows/03-solved-issues/issue77_status.md +16 -0
- cellpycore-0.1.3/.issueflows/03-solved-issues/issue82_original.md +9 -0
- cellpycore-0.1.3/.issueflows/03-solved-issues/issue82_status.md +13 -0
- cellpycore-0.1.3/.issueflows/03-solved-issues/issue84_original.md +7 -0
- cellpycore-0.1.3/.issueflows/03-solved-issues/issue84_plan.md +71 -0
- cellpycore-0.1.3/.issueflows/03-solved-issues/issue84_status.md +17 -0
- cellpycore-0.1.3/.issueflows/03-solved-issues/issue86_original.md +60 -0
- cellpycore-0.1.3/.issueflows/03-solved-issues/issue86_plan.md +169 -0
- cellpycore-0.1.3/.issueflows/03-solved-issues/issue86_status.md +22 -0
- {cellpycore-0.1.2 → cellpycore-0.1.3}/.issueflows/04-designs-and-guides/cellpy-core-migration.md +1 -1
- {cellpycore-0.1.2 → cellpycore-0.1.3}/.issueflows/04-designs-and-guides/code-review-2026-07.md +11 -0
- {cellpycore-0.1.2 → cellpycore-0.1.3}/.issueflows/04-designs-and-guides/step-table-polars-migration.md +3 -3
- {cellpycore-0.1.2 → cellpycore-0.1.3}/.issueflows/04-designs-and-guides/summary-extractors.md +3 -3
- {cellpycore-0.1.2 → cellpycore-0.1.3}/.issueflows/04-designs-and-guides/test-data-and-fixtures.md +5 -5
- cellpycore-0.1.3/.issueflows/04-designs-and-guides/this-project.md +81 -0
- cellpycore-0.1.3/.pre-commit-config.yaml +13 -0
- {cellpycore-0.1.2 → cellpycore-0.1.3}/AGENTS.md +14 -1
- {cellpycore-0.1.2 → cellpycore-0.1.3}/HISTORY.md +41 -0
- cellpycore-0.1.3/PKG-INFO +101 -0
- cellpycore-0.1.3/README.md +81 -0
- cellpycore-0.1.3/ROADMAP.md +57 -0
- {cellpycore-0.1.2 → cellpycore-0.1.3}/cellpy-core.code-workspace +3 -1
- cellpycore-0.1.3/graphify-out/.graphify_labels.json +266 -0
- cellpycore-0.1.3/graphify-out/.graphify_root +1 -0
- cellpycore-0.1.3/graphify-out/GRAPH_REPORT.md +1125 -0
- cellpycore-0.1.3/graphify-out/graph.html +307 -0
- cellpycore-0.1.3/graphify-out/graph.json +55732 -0
- cellpycore-0.1.3/graphify-out/manifest.json +932 -0
- {cellpycore-0.1.2 → cellpycore-0.1.3}/pyproject.toml +25 -9
- cellpycore-0.1.3/src/cellpycore/__init__.py +47 -0
- {cellpycore-0.1.2 → cellpycore-0.1.3}/src/cellpycore/cell_core.py +244 -58
- {cellpycore-0.1.2 → cellpycore-0.1.3}/src/cellpycore/config.py +34 -2
- cellpycore-0.1.3/src/cellpycore/exceptions.py +13 -0
- {cellpycore-0.1.2 → cellpycore-0.1.3}/src/cellpycore/extractors.py +1 -3
- cellpycore-0.1.3/src/cellpycore/legacy/__init__.py +41 -0
- cellpycore-0.1.2/src/cellpycore/legacy.py → cellpycore-0.1.3/src/cellpycore/legacy/headers.py +2 -138
- cellpycore-0.1.3/src/cellpycore/legacy/limits.py +34 -0
- cellpycore-0.1.2/src/cellpycore/header_mapping.py → cellpycore-0.1.3/src/cellpycore/legacy/mapping.py +142 -51
- cellpycore-0.1.3/src/cellpycore/legacy/meta.py +22 -0
- cellpycore-0.1.3/src/cellpycore/legacy/mock_core.py +66 -0
- {cellpycore-0.1.2/src/cellpycore → cellpycore-0.1.3/src/cellpycore/legacy}/selectors.py +19 -19
- cellpycore-0.1.3/src/cellpycore/merge.py +459 -0
- {cellpycore-0.1.2 → cellpycore-0.1.3}/src/cellpycore/settings_base.py +5 -3
- {cellpycore-0.1.2 → cellpycore-0.1.3}/src/cellpycore/summarizers.py +107 -18
- cellpycore-0.1.3/src/cellpycore/testing/__init__.py +4 -0
- cellpycore-0.1.2/src/cellpycore/_helpers.py → cellpycore-0.1.3/src/cellpycore/testing/mock_data.py +3 -1
- {cellpycore-0.1.2 → cellpycore-0.1.3}/src/cellpycore/timestamps.py +3 -1
- cellpycore-0.1.3/src/cellpycore/units/__init__.py +19 -0
- cellpycore-0.1.3/src/cellpycore/units/converters.py +322 -0
- cellpycore-0.1.3/src/cellpycore/units/spec.py +87 -0
- {cellpycore-0.1.2 → cellpycore-0.1.3}/uv.lock +179 -76
- cellpycore-0.1.2/.cursor/rules/graphify.mdc +0 -10
- cellpycore-0.1.2/.issueflows/04-designs-and-guides/this-project.md +0 -32
- cellpycore-0.1.2/PKG-INFO +0 -104
- cellpycore-0.1.2/README.md +0 -80
- cellpycore-0.1.2/graphify-out/.graphify_labels.json +0 -76
- cellpycore-0.1.2/graphify-out/.graphify_root +0 -1
- cellpycore-0.1.2/graphify-out/GRAPH_REPORT.md +0 -329
- cellpycore-0.1.2/graphify-out/graph.html +0 -305
- cellpycore-0.1.2/graphify-out/graph.json +0 -21426
- cellpycore-0.1.2/graphify-out/manifest.json +0 -198
- cellpycore-0.1.2/scratch.db +0 -0
- cellpycore-0.1.2/src/cellpycore/units.py +0 -257
- {cellpycore-0.1.2 → cellpycore-0.1.3}/.aliases +0 -0
- {cellpycore-0.1.2 → cellpycore-0.1.3}/.cursor/rules/cellpy-core-migration.mdc +0 -0
- {cellpycore-0.1.2 → cellpycore-0.1.3}/.cursor/rules/kiss.mdc +0 -0
- {cellpycore-0.1.2 → cellpycore-0.1.3}/.cursor/rules/this-project.mdc +0 -0
- {cellpycore-0.1.2 → cellpycore-0.1.3}/.cursor/skills/caveman/SKILL.md +0 -0
- {cellpycore-0.1.2 → cellpycore-0.1.3}/.cursor/skills/grill-me/SKILL.md +0 -0
- {cellpycore-0.1.2 → cellpycore-0.1.3}/.cursor/skills/iflow/SKILL.md +0 -0
- {cellpycore-0.1.2 → cellpycore-0.1.3}/.cursor/skills/iflow-cleanup/SKILL.md +0 -0
- {cellpycore-0.1.2 → cellpycore-0.1.3}/.cursor/skills/iflow-comments/SKILL.md +0 -0
- {cellpycore-0.1.2 → cellpycore-0.1.3}/.cursor/skills/iflow-fix/SKILL.md +0 -0
- {cellpycore-0.1.2 → cellpycore-0.1.3}/.cursor/skills/iflow-graphify/SKILL.md +0 -0
- {cellpycore-0.1.2 → cellpycore-0.1.3}/.cursor/skills/iflow-history-update/SKILL.md +0 -0
- {cellpycore-0.1.2 → cellpycore-0.1.3}/.cursor/skills/iflow-init/SKILL.md +0 -0
- {cellpycore-0.1.2 → cellpycore-0.1.3}/.cursor/skills/iflow-pause/SKILL.md +0 -0
- {cellpycore-0.1.2 → cellpycore-0.1.3}/.cursor/skills/iflow-plan/SKILL.md +0 -0
- {cellpycore-0.1.2 → cellpycore-0.1.3}/.cursor/skills/iflow-start/SKILL.md +0 -0
- {cellpycore-0.1.2 → cellpycore-0.1.3}/.cursor/skills/iflow-status/SKILL.md +0 -0
- {cellpycore-0.1.2 → cellpycore-0.1.3}/.cursor/skills/iflow-version-bump/SKILL.md +0 -0
- {cellpycore-0.1.2 → cellpycore-0.1.3}/.issueflows/00-tools/.gitkeep +0 -0
- {cellpycore-0.1.2 → cellpycore-0.1.3}/.issueflows/00-tools/README.md +0 -0
- {cellpycore-0.1.2 → cellpycore-0.1.3}/.issueflows/01-current-issues/.gitkeep +0 -0
- {cellpycore-0.1.2 → cellpycore-0.1.3}/.issueflows/02-partly-solved-issues/.gitkeep +0 -0
- {cellpycore-0.1.2 → cellpycore-0.1.3}/.issueflows/03-solved-issues/.gitkeep +0 -0
- {cellpycore-0.1.2 → cellpycore-0.1.3}/.issueflows/03-solved-issues/issue10_original.md +0 -0
- {cellpycore-0.1.2 → cellpycore-0.1.3}/.issueflows/03-solved-issues/issue10_plan.md +0 -0
- {cellpycore-0.1.2 → cellpycore-0.1.3}/.issueflows/03-solved-issues/issue10_status.md +0 -0
- {cellpycore-0.1.2 → cellpycore-0.1.3}/.issueflows/03-solved-issues/issue12_original.md +0 -0
- {cellpycore-0.1.2 → cellpycore-0.1.3}/.issueflows/03-solved-issues/issue12_plan.md +0 -0
- {cellpycore-0.1.2 → cellpycore-0.1.3}/.issueflows/03-solved-issues/issue12_status.md +0 -0
- {cellpycore-0.1.2 → cellpycore-0.1.3}/.issueflows/03-solved-issues/issue13_original.md +0 -0
- {cellpycore-0.1.2 → cellpycore-0.1.3}/.issueflows/03-solved-issues/issue13_plan.md +0 -0
- {cellpycore-0.1.2 → cellpycore-0.1.3}/.issueflows/03-solved-issues/issue13_status.md +0 -0
- {cellpycore-0.1.2 → cellpycore-0.1.3}/.issueflows/03-solved-issues/issue21_original.md +0 -0
- {cellpycore-0.1.2 → cellpycore-0.1.3}/.issueflows/03-solved-issues/issue21_plan.md +0 -0
- {cellpycore-0.1.2 → cellpycore-0.1.3}/.issueflows/03-solved-issues/issue21_status.md +0 -0
- {cellpycore-0.1.2 → cellpycore-0.1.3}/.issueflows/03-solved-issues/issue22_original.md +0 -0
- {cellpycore-0.1.2 → cellpycore-0.1.3}/.issueflows/03-solved-issues/issue22_plan.md +0 -0
- {cellpycore-0.1.2 → cellpycore-0.1.3}/.issueflows/03-solved-issues/issue22_status.md +0 -0
- {cellpycore-0.1.2 → cellpycore-0.1.3}/.issueflows/03-solved-issues/issue23_original.md +0 -0
- {cellpycore-0.1.2 → cellpycore-0.1.3}/.issueflows/03-solved-issues/issue23_plan.md +0 -0
- {cellpycore-0.1.2 → cellpycore-0.1.3}/.issueflows/03-solved-issues/issue23_status.md +0 -0
- {cellpycore-0.1.2 → cellpycore-0.1.3}/.issueflows/03-solved-issues/issue24_original.md +0 -0
- {cellpycore-0.1.2 → cellpycore-0.1.3}/.issueflows/03-solved-issues/issue24_status.md +0 -0
- {cellpycore-0.1.2 → cellpycore-0.1.3}/.issueflows/03-solved-issues/issue29_original.md +0 -0
- {cellpycore-0.1.2 → cellpycore-0.1.3}/.issueflows/03-solved-issues/issue29_plan.md +0 -0
- {cellpycore-0.1.2 → cellpycore-0.1.3}/.issueflows/03-solved-issues/issue29_status.md +0 -0
- {cellpycore-0.1.2 → cellpycore-0.1.3}/.issueflows/03-solved-issues/issue30_original.md +0 -0
- {cellpycore-0.1.2 → cellpycore-0.1.3}/.issueflows/03-solved-issues/issue30_plan.md +0 -0
- {cellpycore-0.1.2 → cellpycore-0.1.3}/.issueflows/03-solved-issues/issue30_status.md +0 -0
- {cellpycore-0.1.2 → cellpycore-0.1.3}/.issueflows/03-solved-issues/issue32_original.md +0 -0
- {cellpycore-0.1.2 → cellpycore-0.1.3}/.issueflows/03-solved-issues/issue32_plan.md +0 -0
- {cellpycore-0.1.2 → cellpycore-0.1.3}/.issueflows/03-solved-issues/issue32_status.md +0 -0
- {cellpycore-0.1.2 → cellpycore-0.1.3}/.issueflows/03-solved-issues/issue34_original.md +0 -0
- {cellpycore-0.1.2 → cellpycore-0.1.3}/.issueflows/03-solved-issues/issue34_plan.md +0 -0
- {cellpycore-0.1.2 → cellpycore-0.1.3}/.issueflows/03-solved-issues/issue36_original.md +0 -0
- {cellpycore-0.1.2 → cellpycore-0.1.3}/.issueflows/03-solved-issues/issue36_status.md +0 -0
- {cellpycore-0.1.2 → cellpycore-0.1.3}/.issueflows/03-solved-issues/issue39_original.md +0 -0
- {cellpycore-0.1.2 → cellpycore-0.1.3}/.issueflows/03-solved-issues/issue39_plan.md +0 -0
- {cellpycore-0.1.2 → cellpycore-0.1.3}/.issueflows/03-solved-issues/issue39_status.md +0 -0
- {cellpycore-0.1.2 → cellpycore-0.1.3}/.issueflows/03-solved-issues/issue40_original.md +0 -0
- {cellpycore-0.1.2 → cellpycore-0.1.3}/.issueflows/03-solved-issues/issue40_plan.md +0 -0
- {cellpycore-0.1.2 → cellpycore-0.1.3}/.issueflows/03-solved-issues/issue40_status.md +0 -0
- {cellpycore-0.1.2 → cellpycore-0.1.3}/.issueflows/03-solved-issues/issue41_original.md +0 -0
- {cellpycore-0.1.2 → cellpycore-0.1.3}/.issueflows/03-solved-issues/issue41_plan.md +0 -0
- {cellpycore-0.1.2 → cellpycore-0.1.3}/.issueflows/03-solved-issues/issue41_status.md +0 -0
- {cellpycore-0.1.2 → cellpycore-0.1.3}/.issueflows/03-solved-issues/issue42_original.md +0 -0
- {cellpycore-0.1.2 → cellpycore-0.1.3}/.issueflows/03-solved-issues/issue42_plan.md +0 -0
- {cellpycore-0.1.2 → cellpycore-0.1.3}/.issueflows/03-solved-issues/issue42_status.md +0 -0
- {cellpycore-0.1.2 → cellpycore-0.1.3}/.issueflows/03-solved-issues/issue43_original.md +0 -0
- {cellpycore-0.1.2 → cellpycore-0.1.3}/.issueflows/03-solved-issues/issue43_plan.md +0 -0
- {cellpycore-0.1.2 → cellpycore-0.1.3}/.issueflows/03-solved-issues/issue43_status.md +0 -0
- {cellpycore-0.1.2 → cellpycore-0.1.3}/.issueflows/03-solved-issues/issue44_original.md +0 -0
- {cellpycore-0.1.2 → cellpycore-0.1.3}/.issueflows/03-solved-issues/issue44_status.md +0 -0
- {cellpycore-0.1.2 → cellpycore-0.1.3}/.issueflows/03-solved-issues/issue45_original.md +0 -0
- {cellpycore-0.1.2 → cellpycore-0.1.3}/.issueflows/03-solved-issues/issue45_plan.md +0 -0
- {cellpycore-0.1.2 → cellpycore-0.1.3}/.issueflows/03-solved-issues/issue45_status.md +0 -0
- {cellpycore-0.1.2 → cellpycore-0.1.3}/.issueflows/03-solved-issues/issue50_original.md +0 -0
- {cellpycore-0.1.2 → cellpycore-0.1.3}/.issueflows/03-solved-issues/issue50_plan.md +0 -0
- {cellpycore-0.1.2 → cellpycore-0.1.3}/.issueflows/03-solved-issues/issue50_status.md +0 -0
- {cellpycore-0.1.2 → cellpycore-0.1.3}/.issueflows/03-solved-issues/issue54_original.md +0 -0
- {cellpycore-0.1.2 → cellpycore-0.1.3}/.issueflows/03-solved-issues/issue54_plan.md +0 -0
- {cellpycore-0.1.2 → cellpycore-0.1.3}/.issueflows/03-solved-issues/issue54_status.md +0 -0
- {cellpycore-0.1.2 → cellpycore-0.1.3}/.issueflows/03-solved-issues/issue55_original.md +0 -0
- {cellpycore-0.1.2 → cellpycore-0.1.3}/.issueflows/03-solved-issues/issue55_plan.md +0 -0
- {cellpycore-0.1.2 → cellpycore-0.1.3}/.issueflows/03-solved-issues/issue55_status.md +0 -0
- {cellpycore-0.1.2 → cellpycore-0.1.3}/.issueflows/03-solved-issues/issue56_original.md +0 -0
- {cellpycore-0.1.2 → cellpycore-0.1.3}/.issueflows/03-solved-issues/issue56_plan.md +0 -0
- {cellpycore-0.1.2 → cellpycore-0.1.3}/.issueflows/03-solved-issues/issue56_status.md +0 -0
- {cellpycore-0.1.2 → cellpycore-0.1.3}/.issueflows/04-designs-and-guides/.gitkeep +0 -0
- {cellpycore-0.1.2 → cellpycore-0.1.3}/.issueflows/04-designs-and-guides/cellpy-core-integration-into-cellpy.md +0 -0
- {cellpycore-0.1.2 → cellpycore-0.1.3}/.issueflows/04-designs-and-guides/cellpy-core-integration-roadmap.md +0 -0
- {cellpycore-0.1.2 → cellpycore-0.1.3}/.issueflows/04-designs-and-guides/column-headers-review.md +0 -0
- {cellpycore-0.1.2 → cellpycore-0.1.3}/.issueflows/04-designs-and-guides/metadata-scaffolding.md +0 -0
- {cellpycore-0.1.2 → cellpycore-0.1.3}/.issueflows/04-designs-and-guides/release-procedure.md +0 -0
- {cellpycore-0.1.2 → cellpycore-0.1.3}/.issueflows/04-designs-and-guides/selector-dead-code-deferral.md +0 -0
- {cellpycore-0.1.2 → cellpycore-0.1.3}/.issueflows/04-designs-and-guides/test-metadata-and-merging.md +0 -0
- {cellpycore-0.1.2 → cellpycore-0.1.3}/.issueflows/config.toml +0 -0
- {cellpycore-0.1.2 → cellpycore-0.1.3}/.python-version +0 -0
- {cellpycore-0.1.2 → cellpycore-0.1.3}/.vscode/settings.json +0 -0
- {cellpycore-0.1.2 → cellpycore-0.1.3}/LICENSE +0 -0
- {cellpycore-0.1.2 → cellpycore-0.1.3}/src/cellpycore/metadata/__init__.py +7 -7
- {cellpycore-0.1.2 → cellpycore-0.1.3}/src/cellpycore/metadata/io.py +0 -0
- {cellpycore-0.1.2 → cellpycore-0.1.3}/src/cellpycore/metadata/models.py +0 -0
- /cellpycore-0.1.2/src/cellpycore/__init__.py → /cellpycore-0.1.3/src/cellpycore/py.typed +0 -0
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: graphify knowledge graph context
|
|
3
|
+
alwaysApply: true
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
This project has a graphify knowledge graph at graphify-out/.
|
|
7
|
+
|
|
8
|
+
- For codebase or architecture questions, when `graphify-out/graph.json` exists, first run `graphify query "<question>"` (or `graphify path "<A>" "<B>"` / `graphify explain "<concept>"`). These return a scoped subgraph, usually much smaller than `GRAPH_REPORT.md` or raw grep output.
|
|
9
|
+
- If graphify-out/wiki/index.md exists, navigate it instead of reading raw files
|
|
10
|
+
- Read graphify-out/GRAPH_REPORT.md only for broad architecture review or when query/path/explain do not surface enough context
|
|
11
|
+
- After modifying code files in this session, run `graphify update .` to keep the graph current (AST-only, no API cost)
|
|
@@ -118,7 +118,11 @@ The full slash-command lifecycle is:
|
|
|
118
118
|
5. **`/iflow-close`** — tests, optional `uv version --bump`, status update, commit, push, PR. Does not delete branches.
|
|
119
119
|
6. **`/iflow-cleanup`** — post-merge: switch to default, `git pull --ff-only`, `git fetch --prune`, `git branch -d` on merged local branches under a single consolidated confirm. Never `-D`.
|
|
120
120
|
|
|
121
|
-
`/iflow-yolo` chains `init → plan → start → close` for small, low-risk issues with up-front safeguards (clean tree, passing tests, single consolidated confirm).
|
|
121
|
+
`/iflow-yolo` chains `init → plan → start → close yolo` for small, low-risk issues with up-front safeguards (clean tree, passing tests, single consolidated confirm). Its close step is hands-off: changelog decided without a prompt, PR merged (`gh pr merge --squash`, `--auto` fallback), then default-branch switch + pull.
|
|
122
|
+
|
|
123
|
+
|
|
124
|
+
Issue labels can select the flow: when an issue picked via `/iflow-pick` carries the **`yolo`** label, it is routed through `/iflow-yolo` (one combined confirmation). Controlled by `label_flows` (default `true`) and `yolo_label` (default `"yolo"`) under `[issueflow]` in `.issueflows/config.toml`; re-run `issue-flow update` after changing them.
|
|
125
|
+
|
|
122
126
|
|
|
123
127
|
`/iflow-fix` opens an interactive iterative-fixes session: it creates one GitHub issue + long-lived branch, then loops over many small fixes (each gets a short plan and is implemented only on confirmation, recorded as a dated bullet in `issue<N>_status.md`), and ends with `/iflow-close`. It is off-path (never auto-dispatched); while a session is active, drive it with `/iflow-fix` + `/iflow-close`, not `/iflow`.
|
|
124
128
|
|
|
@@ -38,13 +38,17 @@ When a bump applies: read `.cursor/skills/iflow-version-bump/SKILL.md`, run the
|
|
|
38
38
|
|
|
39
39
|
- **`stay`**, **`stay on branch`**, **`don't switch`**, or **`dont switch to main`** → after the PR step, stay on the issue branch instead of switching back to the default branch.
|
|
40
40
|
|
|
41
|
+
## Hands-off token (command input)
|
|
42
|
+
|
|
43
|
+
- **`yolo`** (used by `/iflow-yolo`) → close the loop without user input: write the `HISTORY.md` bullet without a confirm prompt (step 3), **merge the PR** right after opening it (step 8a), then switch back to the default branch and `git pull --ff-only` (step 9, unless `stay` was also passed).
|
|
44
|
+
|
|
41
45
|
## Instructions
|
|
42
46
|
|
|
43
47
|
1. **Sanity check** — Run the project test suite (e.g. `uv run pytest`) and any checks the repo relies on. Skim the diff; avoid bundling unrelated changes. Confirm that any design decisions or good practices that emerged from this issue are captured under `.issueflows/04-designs-and-guides/` before committing.
|
|
44
48
|
|
|
45
49
|
2. **Optional version bump** — If the user asked for a bump (see above), follow `.cursor/skills/iflow-version-bump/SKILL.md` and run `uv version --bump <patch|minor|major>`. If there is no bumpable `pyproject.toml`, skip and continue.
|
|
46
50
|
|
|
47
|
-
3. **Update `HISTORY.md`** — Unless the user passed `nohistory`, follow `.cursor/skills/iflow-history-update/SKILL.md`. If step 2 did not bump the version, append a bullet to the `## [Unreleased]` section. If step 2 bumped the version, promote `## [Unreleased]` to `## [<new_version>] - <YYYY-MM-DD>` and open a fresh empty `## [Unreleased]` above it. Show the diff and confirm once before writing. Skip with a note if `HISTORY.md` does not exist at the project root.
|
|
51
|
+
3. **Update `HISTORY.md`** — Unless the user passed `nohistory`, follow `.cursor/skills/iflow-history-update/SKILL.md`. If step 2 did not bump the version, append a bullet to the `## [Unreleased]` section. If step 2 bumped the version, promote `## [Unreleased]` to `## [<new_version>] - <YYYY-MM-DD>` and open a fresh empty `## [Unreleased]` above it. Show the diff and confirm once before writing. Skip with a note if `HISTORY.md` does not exist at the project root. With the `yolo` token, do not ask — decide yourself and write the bullet (issue title, or `log "..."` text) directly.
|
|
48
52
|
|
|
49
53
|
4. **Issue tracking** — Under `.issueflows/01-current-issues/`, update the status file: remaining work, checklists, and **`- [x] Done`** only when the issue is fully resolved. If fully resolved, move that issue's markdown files (`issue<n>_*`) to `.issueflows/03-solved-issues/`. If partially resolved, move to `.issueflows/02-partly-solved-issues/`. Follow any stricter rules in `.cursor/rules/issueflow-rules.mdc` if present.
|
|
50
54
|
|
|
@@ -56,11 +60,13 @@ When a bump applies: read `.cursor/skills/iflow-version-bump/SKILL.md`, run the
|
|
|
56
60
|
|
|
57
61
|
8. **Pull request** — Open (or update) a PR against the default branch. Body should explain the change, how to test, and link the GitHub issue (`Closes #n` / `Refs #n`).
|
|
58
62
|
|
|
59
|
-
|
|
63
|
+
8a. **Merge the PR (`yolo` token only)** — Merge immediately with `gh pr merge <number> --squash` (never `--delete-branch`; branch deletion stays in `/iflow-cleanup`). If GitHub refuses (branch protection, pending checks), fall back to `gh pr merge <number> --squash --auto` and report the merge as queued. If even `--auto` fails, stop the hands-off behaviour, report the error, and leave the PR open. Without the `yolo` token, skip this step — merging stays a user decision (step 10).
|
|
64
|
+
|
|
65
|
+
9. **Switch back when safe** — Detect the default branch (prefer `gh repo view --json defaultBranchRef -q .defaultBranchRef.name`, else `git symbolic-ref --quiet --short refs/remotes/origin/HEAD`, else `main`). If the input included `stay`, `stay on branch`, `don't switch`, or `dont switch to main`, stay on the issue branch and report that opt-out. Otherwise run `git status --porcelain` after the PR is open or updated. If it is clean, run `git switch <default>` and then `git pull --ff-only`; a clean tree here means the branch work has been committed and pushed to the PR branch. If dirty, stay on the current branch, list the uncommitted paths, and explain that switching is unsafe until those changes are committed, stashed, or discarded by the user. Never delete the issue branch here. With the `yolo` token this step runs **after** the merge from step 8a so the pull brings the squash commit into the local default branch (a queued auto-merge arrives later; note that).
|
|
60
66
|
|
|
61
|
-
10. **After review** —
|
|
67
|
+
10. **After review** — With the `yolo` token the PR was already merged in step 8a; skip to the `/iflow-cleanup` reminder. Otherwise address feedback, push updates, and merge when approved and CI is green. If step 9 switched back to the default branch, switch to the PR branch again before making review fixes. Tell the user to run **`/iflow-cleanup`** once the PR is merged so the standard post-merge cleanup runs (`git fetch --prune`, `git branch -d` on merged local branches under a single consolidated confirm).
|
|
62
68
|
|
|
63
|
-
11. **Output** — Summarize commit, push result, PR URL, whether the working copy switched back to the default branch or stayed on the issue branch, and next step (`/iflow-cleanup` after merge, or "blocked on …" if stuck).
|
|
69
|
+
11. **Output** — Summarize commit, push result, PR URL, whether the working copy switched back to the default branch or stayed on the issue branch, the merge result when `yolo` applied (merged, or queued via `--auto`), and next step (`/iflow-cleanup` after merge, or "blocked on …" if stuck).
|
|
64
70
|
|
|
65
71
|
## Constraints
|
|
66
72
|
|
|
@@ -40,7 +40,8 @@ Do **not** use this skill from `/iflow`, `/iflow-start`, or `/iflow-close`. `/if
|
|
|
40
40
|
5. **Create a `fix` issue (only when requested).** Use `gh issue create` (e.g. `chore: general fixes`), confirm title/body first, capture the new number. A fresh issue is created each time — never reuse an existing open general-fixes issue.
|
|
41
41
|
6. **Over-large issue (note only).** If the chosen issue is too big for one PR, **mention** that breaking it into sub-issues is possible and tracked as a follow-up (Phase B of issue #63). Do **not** auto-create sub-issues here.
|
|
42
42
|
|
|
43
|
-
|
|
43
|
+
7. **Label-driven yolo flow.** If the chosen issue carries the **`yolo`** label (case-insensitive), announce it and fold `/iflow-yolo`'s consolidated confirm into the pick confirmation (one prompt: branch + full `init → plan → start → close yolo` chain). On yes, run Phase 2 then follow the `iflow-yolo` skill **instead of** the Phase 3 handoff — its preflight still applies, but do not re-ask its confirm. Configurable via `label_flows` / `yolo_label` under `[issueflow]` in `.issueflows/config.toml` (re-run `issue-flow update` after changing).
|
|
44
|
+
|
|
44
45
|
|
|
45
46
|
1. **Require a clean tree** (`git status --porcelain`). If dirty, **stop** and ask the user to commit/stash.
|
|
46
47
|
2. **Branch off the default** — switch to default, fast-forward, then `git switch -c <N>-<short-slug>` (GitHub numeric convention). Confirm a non-obvious slug.
|
|
@@ -50,6 +51,9 @@ Do **not** use this skill from `/iflow`, `/iflow-start`, or `/iflow-close`. `/if
|
|
|
50
51
|
|
|
51
52
|
1. **Ask** whether to continue with `/iflow-plan`. Do not auto-run it.
|
|
52
53
|
|
|
54
|
+
2. **Exception:** when the `yolo`-label routing was confirmed in Phase 1, skip this handoff — the `iflow-yolo` chain (which includes `/iflow-init`) takes over after the branch is created.
|
|
55
|
+
|
|
56
|
+
|
|
53
57
|
## Constraints
|
|
54
58
|
|
|
55
59
|
- Off-path: never auto-dispatch from `/iflow`, `/iflow-start`, or `/iflow-close`.
|
|
@@ -3,7 +3,8 @@ name: iflow-yolo
|
|
|
3
3
|
description: >-
|
|
4
4
|
Run the /iflow-yolo workflow: preflight (no default branch, clean tree,
|
|
5
5
|
passing tests), single consolidated confirm, then chain init → plan → start
|
|
6
|
-
→ close
|
|
6
|
+
→ close yolo (hands-off close: auto changelog, PR merge, default-branch
|
|
7
|
+
pull) for small, low-risk issues. Stops on any ambiguity.
|
|
7
8
|
disable-model-invocation: true
|
|
8
9
|
---
|
|
9
10
|
|
|
@@ -26,7 +27,7 @@ Use only for minor fixes, doc tweaks, and similar low-risk changes. Anything non
|
|
|
26
27
|
|
|
27
28
|
3. **Tests must pass up front.** Run `uv run pytest` (or the repo's documented test command). On any failure, **stop** before the chain starts.
|
|
28
29
|
|
|
29
|
-
4. **Single consolidated confirm.** Present the full planned chain explicitly (issue reference, target branch, repo, downstream commands including any `bump` / `patch` / `draft` / `stay` flags). Require an explicit yes; any other input aborts.
|
|
30
|
+
4. **Single consolidated confirm.** Present the full planned chain explicitly (issue reference, target branch, repo, downstream commands including any `bump` / `patch` / `draft` / `stay` flags). Require an explicit yes; any other input aborts. (When `/iflow-pick` routed here via the yolo issue label, its combined confirmation already covered this — do not ask twice.)
|
|
30
31
|
|
|
31
32
|
## Chain
|
|
32
33
|
|
|
@@ -36,11 +37,11 @@ Once preflight has passed and the user confirmed:
|
|
|
36
37
|
2. **`/iflow-plan`** — write a **short** `issue<N>_plan.md` (Goal + Approach + Files to touch + Test strategy). Auto-confirm — the consolidated confirm above covered it. If the scope check reveals the change is not actually small, **abort the yolo chain** and tell the user to run the commands individually.
|
|
37
38
|
3. **`/iflow-start`** — implement the plan without an additional plan-mode prompt.
|
|
38
39
|
4. **Re-run tests.** `uv run pytest` again. On failure, **stop** before commit / push / PR.
|
|
39
|
-
5. **`/iflow-close`** — run the
|
|
40
|
+
5. **`/iflow-close yolo`** — run the close flow with the `yolo` token (plus forwarded `bump` / `log` / `nohistory` / `draft` / `stay` tokens). The `yolo` token makes close hands-off: changelog bullet written without a confirm prompt, PR **merged** via `gh pr merge --squash` (fall back to `--squash --auto` when branch protection or pending checks block it), then default-branch switch + `git pull --ff-only`. `draft` conflicts with auto-merge — when passed, skip the merge and say so. Do **not** chain `/iflow-cleanup` automatically — local branch deletion stays a user decision.
|
|
40
41
|
|
|
41
42
|
## Post-run
|
|
42
43
|
|
|
43
|
-
Report the PR URL and final branch. By default `/iflow-close` switches back to the default branch
|
|
44
|
+
Report the PR URL, the merge result (merged, or queued via `--auto`), and the final branch. By default `/iflow-close yolo` merges the PR and switches back to the default branch with a pull; forwarded `stay` text leaves the user on the issue branch instead. Remind them that `/iflow-cleanup` will delete the now-merged local branch when they are ready.
|
|
44
45
|
|
|
45
46
|
## Constraints
|
|
46
47
|
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
# Issue #62 — readme links not working on pypi
|
|
2
|
+
|
|
3
|
+
- **URL:** https://github.com/cellpy/cellpy-core/issues/62
|
|
4
|
+
- **State:** open
|
|
5
|
+
- **Labels:** yolo
|
|
6
|
+
- **Captured:** 2026-07-02
|
|
7
|
+
|
|
8
|
+
## Original description
|
|
9
|
+
|
|
10
|
+
The links in the readme do not work on pypi. I guess the docs folder is not a
|
|
11
|
+
part of the package. If so, consider either linking to the locations in the
|
|
12
|
+
github repo or include those three files that have links on readme into the
|
|
13
|
+
package.
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
# Issue #62 — plan
|
|
2
|
+
|
|
3
|
+
## Goal
|
|
4
|
+
|
|
5
|
+
Make the documentation links in `README.md` work when rendered on PyPI.
|
|
6
|
+
|
|
7
|
+
## Approach
|
|
8
|
+
|
|
9
|
+
Relative links (`docs/...`) break on PyPI because the docs folder is not part
|
|
10
|
+
of the rendered page context. Replace the three relative doc links in the
|
|
11
|
+
README with absolute GitHub URLs pointing at `main`
|
|
12
|
+
(`https://github.com/cellpy/cellpy-core/blob/main/docs/...`). No packaging
|
|
13
|
+
changes — simplest fix, keeps the sdist/wheel lean.
|
|
14
|
+
|
|
15
|
+
## Files to touch
|
|
16
|
+
|
|
17
|
+
- `README.md`
|
|
18
|
+
|
|
19
|
+
## Test strategy
|
|
20
|
+
|
|
21
|
+
- `uv run pytest` (no code changes, suite must stay green).
|
|
22
|
+
- Visual check that the rewritten URLs resolve on GitHub.
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
# Issue #62 — status
|
|
2
|
+
|
|
3
|
+
- [x] Done
|
|
4
|
+
|
|
5
|
+
## What was done
|
|
6
|
+
|
|
7
|
+
- 2026-07-02: Replaced the three relative doc links in `README.md` with
|
|
8
|
+
absolute GitHub URLs (`https://github.com/cellpy/cellpy-core/blob/main/docs/...`)
|
|
9
|
+
so they render correctly on PyPI. Verified all three target files exist.
|
|
10
|
+
Full test suite green (107 passed). No packaging changes needed.
|
|
11
|
+
|
|
12
|
+
## Remaining work
|
|
13
|
+
|
|
14
|
+
None.
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
# Issue #64: small update in readme
|
|
2
|
+
|
|
3
|
+
Source: https://github.com/cellpy/cellpy-core/issues/64
|
|
4
|
+
|
|
5
|
+
## Original issue text
|
|
6
|
+
|
|
7
|
+
The developer section in readme mentions running "uv venv". We should instead use the built in project manager in uv (so, developers should run "uv sync" after cloning the repo, and "uv add some-package" when adding new dependencies).
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
# Issue #64 plan: small update in readme
|
|
2
|
+
|
|
3
|
+
## Goal
|
|
4
|
+
|
|
5
|
+
The Developing section in `README.md` tells developers to run `uv venv` +
|
|
6
|
+
`uv pip install -e ".[dev]"`. Switch to uv's built-in project workflow:
|
|
7
|
+
`uv sync` after cloning, `uv add` for new dependencies.
|
|
8
|
+
|
|
9
|
+
## Approach
|
|
10
|
+
|
|
11
|
+
Rewrite the "Development Workflow" and "Common Commands" parts of the
|
|
12
|
+
Developing section:
|
|
13
|
+
|
|
14
|
+
- Drop `uv venv` + activate + `uv pip install -e ".[dev]"`; replace with a
|
|
15
|
+
single `uv sync` step (creates `.venv` and installs all locked deps).
|
|
16
|
+
- Keep `uv add` / `uv add --dev` for adding dependencies.
|
|
17
|
+
- Run tests via `uv run pytest`.
|
|
18
|
+
- Update "Common Commands" to project-manager equivalents (`uv remove`,
|
|
19
|
+
`uv sync --upgrade`, `uv tree`).
|
|
20
|
+
|
|
21
|
+
## Files to touch
|
|
22
|
+
|
|
23
|
+
- `README.md` (only)
|
|
24
|
+
|
|
25
|
+
## Test strategy
|
|
26
|
+
|
|
27
|
+
Docs-only change; run `uv run pytest` before commit to confirm the suite is
|
|
28
|
+
still green (yolo chain requirement).
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# Issue #64 status: small update in readme
|
|
2
|
+
|
|
3
|
+
- [x] Done
|
|
4
|
+
|
|
5
|
+
## What was done
|
|
6
|
+
|
|
7
|
+
- Rewrote the "Development Workflow" part of `README.md` Developing section:
|
|
8
|
+
replaced `uv venv` + activate + `uv pip install -e ".[dev]"` with a single
|
|
9
|
+
`uv sync` step; kept `uv add` / `uv add --dev`; tests now via `uv run pytest`.
|
|
10
|
+
- Updated "Common Commands" to project-manager equivalents (`uv sync`,
|
|
11
|
+
`uv remove`, `uv sync --upgrade`, `uv tree`), dropping the `uv pip ...`
|
|
12
|
+
commands.
|
|
13
|
+
- Added a `HISTORY.md` bullet under `[Unreleased]`.
|
|
14
|
+
|
|
15
|
+
## Remaining work
|
|
16
|
+
|
|
17
|
+
None. Docs-only change; test suite green (107 passed).
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
# Issue #66: code cleaning and test completion
|
|
2
|
+
|
|
3
|
+
Source: https://github.com/cellpy/cellpy-core/issues/66
|
|
4
|
+
|
|
5
|
+
## Original issue text
|
|
6
|
+
|
|
7
|
+
Do some refactoring and cleaning up in the codebase. Check .issueflows\04-designs-and-guides\code-review-2026-07.md
|
|
8
|
+
Create appropriate e2e tests.
|
|
9
|
+
Create appropriate profiling tests.
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
# Issue #66 plan: code cleaning and test completion
|
|
2
|
+
|
|
3
|
+
Source issue: [issue66_original.md](issue66_original.md)
|
|
4
|
+
Driving doc: [code-review-2026-07.md](../04-designs-and-guides/code-review-2026-07.md)
|
|
5
|
+
Branch: `66-code-cleaning-and-test-completion`
|
|
6
|
+
|
|
7
|
+
## Goal
|
|
8
|
+
|
|
9
|
+
Land the mechanical cleanup from the 2026-07 code review (hygiene, API truthing,
|
|
10
|
+
engine guards) and close the test gaps with native-path e2e tests and opt-in
|
|
11
|
+
profiling benchmarks.
|
|
12
|
+
|
|
13
|
+
## Constraints
|
|
14
|
+
|
|
15
|
+
- **In scope (grilled + confirmed):** review-doc items D1 (hygiene), D2 (API
|
|
16
|
+
truthing), D5 (engine guards), D7 (test gaps) + e2e + profiling tests.
|
|
17
|
+
- **Out of scope (deferred, filed):** D3 selectors decision (#67, see
|
|
18
|
+
`selector-dead-code-deferral.md`), D4 units fallback (A2, #68), CI coverage
|
|
19
|
+
reporting (#69), B1/B2 design pass (#70), structural refactors (no module
|
|
20
|
+
splits/moves — review verdict: engine is healthy; avoid churn before cellpy
|
|
21
|
+
pins a tag).
|
|
22
|
+
- Parity is enforced by tests (migration doc): golden tests must stay green
|
|
23
|
+
byte-for-byte; no changes to computed values.
|
|
24
|
+
- Legacy bridge (`OldCellpyCellCore`) behavior unchanged — cellpy imports only
|
|
25
|
+
this (verified: `cellpy/readers/cellreader.py:72` is the sole entry).
|
|
26
|
+
- Google-style docstrings; project loggers, not root `logging` calls.
|
|
27
|
+
|
|
28
|
+
### Prior art
|
|
29
|
+
|
|
30
|
+
- `tests/test_golden.py` — legacy-bridge e2e on vendored Arbin parquet with
|
|
31
|
+
golden numbers (`ARBIN_N_STEPS=103`, `ARBIN_N_CYCLES=18`); new native e2e
|
|
32
|
+
mirrors this oracle, does not duplicate the legacy path.
|
|
33
|
+
- `tests/test_harmonized_fixture.py` + `tests/data/arbin_cc_harmonized_raw.parquet`
|
|
34
|
+
— harmonized (native-naming) fixture already vendored; reuse for native e2e.
|
|
35
|
+
- `Data.from_raw_frame` (issue #55) — existing validating front door; native
|
|
36
|
+
e2e drives through it, engine guards (B3) extend the same validation spirit
|
|
37
|
+
into `make_step_table` / `make_summary`.
|
|
38
|
+
- Exclude-types support (issue #54) — covered by `tests/test_exclude_types.py`;
|
|
39
|
+
e2e exercises it as a pipeline variant only.
|
|
40
|
+
- `.issueflows/00-tools/` — only README, no reusable helper applies.
|
|
41
|
+
- graphify: not installed for this repo state (no `graphify-out/` consulted
|
|
42
|
+
beyond rules; grep-based discovery used).
|
|
43
|
+
|
|
44
|
+
## Approach
|
|
45
|
+
|
|
46
|
+
Phased commits on the issue branch, one concern per commit (Conventional
|
|
47
|
+
Commits), tests green after each phase.
|
|
48
|
+
|
|
49
|
+
### Phase 1 — hygiene (D1)
|
|
50
|
+
|
|
51
|
+
1. `pyproject.toml`: remove `duckdb`, `duckdb-engine`, `sqlalchemy`, `narwhals`
|
|
52
|
+
(keep `pyarrow`); drop `uv-dynamic-versioning` from `[build-system]`; real
|
|
53
|
+
description; fix wrong classifier; `uv sync` to refresh lock.
|
|
54
|
+
2. Delete tracked junk: `scratch.db`, `tmp/simple.csv`, `tmp/simple.parquet`
|
|
55
|
+
(+ `.gitignore` entries for `scratch.db`, `tmp/`).
|
|
56
|
+
3. Replace root-logger calls with module loggers (`logger = logging.getLogger(__name__)`)
|
|
57
|
+
in `summarizers.py`, `settings_base.py`, `units.py`.
|
|
58
|
+
4. **A3 falsy-override fix** in `summarizers._classify_steps`: membership test
|
|
59
|
+
(`key in orl`) instead of `or`-fallback for all four override keys +
|
|
60
|
+
regression test with `0.0` override.
|
|
61
|
+
5. **A5**: `make_step_table(raw_limits=None)` → build fresh
|
|
62
|
+
`asdict(CellpyLimits())` per call; keep `DEFAULT_RAW_LIMITS` as a frozen
|
|
63
|
+
`MappingProxyType` for introspection/back-compat (`test_limits.py` uses it).
|
|
64
|
+
6. **A6**: delete `Data.cycle` / `Data.step` dead fields (verified unused in
|
|
65
|
+
cellpy).
|
|
66
|
+
7. CI: add ruff step (`ruff check` + `ruff format --check`) to
|
|
67
|
+
`.github/workflows/simpletest.yml`; minimal `[tool.ruff]` config.
|
|
68
|
+
|
|
69
|
+
### Phase 2 — API truthing (D2)
|
|
70
|
+
|
|
71
|
+
1. `src/cellpycore/__init__.py`: minimal curated exports —
|
|
72
|
+
`CellpyCellCore`, `OldCellpyCellCore`, `Data`, `make_step_table`,
|
|
73
|
+
`make_summary`, `default_schema` + schema types, `NoDataFound`;
|
|
74
|
+
`__version__` via `importlib.metadata.version("cellpy-core")` with
|
|
75
|
+
`PackageNotFoundError` fallback. `metadata` stays a submodule import.
|
|
76
|
+
2. **A4**: delete unused `selector` / `select_columns` / `find_end_voltage`
|
|
77
|
+
params from native `make_core_summary` (legacy bridge keeps its
|
|
78
|
+
`find_end_voltage`).
|
|
79
|
+
3. Add `py.typed` marker (+ ensure hatch includes it).
|
|
80
|
+
4. Docs: fill `this-project.md` stubs; README project description.
|
|
81
|
+
|
|
82
|
+
### Phase 3 — engine guards (D5/B3)
|
|
83
|
+
|
|
84
|
+
- `make_step_table` / `make_summary`: raise `NoDataFound` when `data.raw`
|
|
85
|
+
(resp. `data.steps`) is `None`/missing; raise `ValueError` naming the missing
|
|
86
|
+
required columns. Tests for both.
|
|
87
|
+
|
|
88
|
+
### Phase 4 — tests (D7 + e2e + profiling)
|
|
89
|
+
|
|
90
|
+
1. `tests/test_e2e.py` — native pipeline via public API only
|
|
91
|
+
(`from cellpycore import ...`): harmonized raw parquet →
|
|
92
|
+
`Data.from_raw_frame` → `make_step_table` → `make_summary` →
|
|
93
|
+
exclude-types and scaled-columns variants; assert golden cycle/step counts
|
|
94
|
+
and spot values. Edge cases: empty raw frame, cycle without charge step,
|
|
95
|
+
`override_raw_limits={"current_hard": 0.0}`; thread-safety smoke (two
|
|
96
|
+
schemas, parallel `make_step_table` via `ThreadPoolExecutor`).
|
|
97
|
+
2. `tests/test_benchmarks.py` — `pytest-benchmark` (new dev dep):
|
|
98
|
+
`make_step_table` + `make_summary` on Arbin fixture + small fixture;
|
|
99
|
+
`@pytest.mark.benchmark`, excluded from default run via addopts
|
|
100
|
+
(`-m "not benchmark"`); run manually: `uv run pytest -m benchmark`.
|
|
101
|
+
|
|
102
|
+
## Files to touch
|
|
103
|
+
|
|
104
|
+
- `pyproject.toml` — deps, build-system, metadata, ruff config, addopts, dev dep
|
|
105
|
+
- `uv.lock` — regenerated
|
|
106
|
+
- `scratch.db`, `tmp/` — deleted; `.gitignore` — updated
|
|
107
|
+
- `.github/workflows/simpletest.yml` — ruff step
|
|
108
|
+
- `src/cellpycore/__init__.py` — public API + `__version__`
|
|
109
|
+
- `src/cellpycore/py.typed` — new marker
|
|
110
|
+
- `src/cellpycore/summarizers.py` — A3, A5, logger, guards
|
|
111
|
+
- `src/cellpycore/cell_core.py` — A6, A4
|
|
112
|
+
- `src/cellpycore/settings_base.py`, `src/cellpycore/units.py` — logger only
|
|
113
|
+
- `tests/test_e2e.py`, `tests/test_benchmarks.py` — new
|
|
114
|
+
- `tests/test_limits.py` — adjust for frozen `DEFAULT_RAW_LIMITS`
|
|
115
|
+
- `README.md`, `.issueflows/04-designs-and-guides/this-project.md` — docs
|
|
116
|
+
|
|
117
|
+
## Test strategy
|
|
118
|
+
|
|
119
|
+
- Full suite: `uv run pytest` (must stay green after every phase; golden tests
|
|
120
|
+
are the parity gate).
|
|
121
|
+
- New: A3 regression (`0.0` override), guard tests (`NoDataFound`,
|
|
122
|
+
missing-column `ValueError`), native e2e, thread-safety smoke.
|
|
123
|
+
- Benchmarks opt-in: `uv run pytest -m benchmark` (not in CI).
|
|
124
|
+
- Lint locally before push: `uv run ruff check` + `uv run ruff format --check`.
|
|
125
|
+
|
|
126
|
+
## Open questions
|
|
127
|
+
|
|
128
|
+
- None — resolved via grilling 2026-07-03 (scope split, minimal public API,
|
|
129
|
+
native-path e2e, pytest-benchmark opt-in, no structural refactor).
|
|
130
|
+
|
|
131
|
+
## Follow-ups (filed as GitHub issues, not this issue)
|
|
132
|
+
|
|
133
|
+
- [#67](https://github.com/cellpy/cellpy-core/issues/67) — D3: selectors module
|
|
134
|
+
decision (port vs bridge-only).
|
|
135
|
+
- [#68](https://github.com/cellpy/cellpy-core/issues/68) — D4/A2: units
|
|
136
|
+
fallback → explicit values or `metadata.CellMeta`.
|
|
137
|
+
- [#69](https://github.com/cellpy/cellpy-core/issues/69) — CI coverage
|
|
138
|
+
reporting.
|
|
139
|
+
- [#70](https://github.com/cellpy/cellpy-core/issues/70) — B1/B2 design pass
|
|
140
|
+
(schema-agnostic stat columns; cycle_mode polarity default).
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
# Issue #66 status: code cleaning and test completion
|
|
2
|
+
|
|
3
|
+
- [x] Done
|
|
4
|
+
|
|
5
|
+
Plan: [issue66_plan.md](issue66_plan.md) (confirmed 2026-07-03, deferred items filed as #67–#70)
|
|
6
|
+
|
|
7
|
+
## What's done
|
|
8
|
+
|
|
9
|
+
All four plan phases implemented on branch `66-code-cleaning-and-test-completion`
|
|
10
|
+
(one commit per phase, suite green after each; 120 passed + 3 opt-in benchmarks):
|
|
11
|
+
|
|
12
|
+
- **Phase 1 — hygiene** (`chore:` commit): removed unused deps (duckdb,
|
|
13
|
+
duckdb-engine, sqlalchemy, narwhals) + uv-dynamic-versioning; real pyproject
|
|
14
|
+
description/classifier; deleted tracked `scratch.db` / `tmp/*` (+ gitignore);
|
|
15
|
+
module loggers replace root `logging.*` calls; **A3** falsy-override fix
|
|
16
|
+
(explicit `0.0` wins) + regression test; **A5** `DEFAULT_RAW_LIMITS` frozen
|
|
17
|
+
(`MappingProxyType`), `make_step_table` builds fresh limits per call;
|
|
18
|
+
**A6** dead `Data.cycle` / `Data.step` removed; ruff config + CI lint step;
|
|
19
|
+
ruff check --fix + format applied repo-wide.
|
|
20
|
+
- **Phase 2 — API truthing** (`feat:` commit): curated public API in
|
|
21
|
+
`cellpycore/__init__.py` + `__version__` (importlib.metadata); `py.typed`;
|
|
22
|
+
**A4** dead `find_end_voltage`/`select_columns` removed from *native*
|
|
23
|
+
`make_core_summary` (legacy bridge keeps them — cellpy passes
|
|
24
|
+
`select_columns`); README description + example; `this-project.md` filled.
|
|
25
|
+
- **Phase 3 — engine guards** (`feat:` commit): `NoDataFound` for missing
|
|
26
|
+
`raw`/`steps`, `ValueError` naming every missing required column at
|
|
27
|
+
`make_step_table` / `make_summary`; guard tests.
|
|
28
|
+
- **Phase 4 — tests** (`test:` commit): `tests/test_e2e.py` native pipeline
|
|
29
|
+
via public API on the harmonized Arbin fixture (golden counts 103/18/1457,
|
|
30
|
+
exclude-types + scaled-columns variants, empty-frame and discharge-only
|
|
31
|
+
edge cases, thread-safety smoke with parallel schemas);
|
|
32
|
+
`tests/test_benchmarks.py` (pytest-benchmark, opt-in via
|
|
33
|
+
`uv run pytest -m benchmark`). Engine fix: Null-dtype raw signal columns
|
|
34
|
+
skipped in `make_step_table` (all-null placeholders crashed polars).
|
|
35
|
+
- Deferred issues filed: #67 (selectors), #68 (units fallback), #69 (CI
|
|
36
|
+
coverage), #70 (B1/B2 design pass).
|
|
37
|
+
- graphify graph refreshed.
|
|
38
|
+
|
|
39
|
+
## Remaining work
|
|
40
|
+
|
|
41
|
+
- None. Closed via `/iflow-close` 2026-07-03 (HISTORY.md bullet added, no
|
|
42
|
+
version bump requested). Deferred follow-ups live in issues #67–#70.
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
# Issue #67: Selectors: port remaining functions to native schema or make bridge-only
|
|
2
|
+
|
|
3
|
+
Source: https://github.com/cellpy/cellpy-core/issues/67
|
|
4
|
+
|
|
5
|
+
## Original issue text
|
|
6
|
+
|
|
7
|
+
Deferred from #66 (code review 2026-07, item D3/A1).
|
|
8
|
+
|
|
9
|
+
`selectors.py` is broken with its own default schema: `get_step_numbers`, `get_cycle_numbers`, `get_rates` default to `default_schema()` but dereference legacy-only attribute names (`data_point_txt`, `voltage_txt`, `cycle_index_txt`, ...), so they raise `AttributeError` unless legacy headers are injected. Module is also pandas-only and has zero test coverage.
|
|
10
|
+
|
|
11
|
+
Decide and implement one of:
|
|
12
|
+
- port the functions to the native schema + polars, with tests, or
|
|
13
|
+
- move the module next to `legacy.py` and document it as bridge-only until removal.
|
|
14
|
+
|
|
15
|
+
See `.issueflows/04-designs-and-guides/code-review-2026-07.md` (A1, D3) and `selector-dead-code-deferral.md`.
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
# Issue #67 plan: selectors → bridge-only `legacy_selectors`
|
|
2
|
+
|
|
3
|
+
Confirmed via grill-me (2026-07-03).
|
|
4
|
+
|
|
5
|
+
## Goal
|
|
6
|
+
|
|
7
|
+
Relocate the three remaining pandas selector helpers (`get_step_numbers`,
|
|
8
|
+
`get_cycle_numbers`, `get_rates`) to a clearly bridge-only module, fix the
|
|
9
|
+
`default_schema()` trap by defaulting to `legacy_schema()`, and add unit +
|
|
10
|
+
golden tests. No native polars port.
|
|
11
|
+
|
|
12
|
+
## Grill decisions (locked)
|
|
13
|
+
|
|
14
|
+
| # | Decision |
|
|
15
|
+
|---|----------|
|
|
16
|
+
| 1 | **Bridge-only** — not a native polars port |
|
|
17
|
+
| 2 | **`legacy_selectors.py`** — delete `selectors.py`; no shim |
|
|
18
|
+
| 3 | **`legacy_schema()` default** — new helper in `config.py`, used when `schema is None` |
|
|
19
|
+
| 4 | **Tests: unit + golden** — handcrafted legacy frames always run; one golden smoke with parquet `skipif` |
|
|
20
|
+
| 5 | **Relocation + schema fix only** — preserve cellpy-parity behavior; do not fix dead code (e.g. unreachable `rate = 0.05` block) |
|
|
21
|
+
|
|
22
|
+
## Constraints
|
|
23
|
+
|
|
24
|
+
- Read-only on cellpy repo; no cellpy changes required (cellpy owns its own
|
|
25
|
+
`cellreader.py` copies; #45 removed the last `cellpycore.selectors` import).
|
|
26
|
+
- Functions stay **pandas-only** (dict / `pandas.DataFrame` returns unchanged).
|
|
27
|
+
- Not part of the public API (`__init__.py` exports unchanged).
|
|
28
|
+
- Google-style docstrings on new/changed public helpers.
|
|
29
|
+
|
|
30
|
+
### Prior art
|
|
31
|
+
|
|
32
|
+
- `src/cellpycore/selectors.py` — current broken module (legacy attr names +
|
|
33
|
+
`default_schema()`).
|
|
34
|
+
- `src/cellpycore/legacy.py` — `HeadersNormal`, `HeadersStepTable`,
|
|
35
|
+
`HeadersSummary` (target neighbourhood).
|
|
36
|
+
- `config.default_schema()` — native `RawCols`/`StepCols`/`CycleCols` bundle.
|
|
37
|
+
- `tests/test_golden._legacy_schema()` — private duplicate; replace with shared
|
|
38
|
+
`config.legacy_schema()`.
|
|
39
|
+
- `tests/test_schema.py` — imports `selectors`, asserts removed #45 functions
|
|
40
|
+
absent; update import path.
|
|
41
|
+
- `cellpy/readers/cellreader.py` — verbatim upstream copies of the three
|
|
42
|
+
functions (parity reference, not imported).
|
|
43
|
+
- `.issueflows/04-designs-and-guides/this-project.md` — already notes selectors
|
|
44
|
+
as bridge-only/broken; update wording post-fix.
|
|
45
|
+
- Graph community (selectors): `get_step_numbers`, `get_cycle_numbers`,
|
|
46
|
+
`get_rates` — isolated, no engine callers.
|
|
47
|
+
|
|
48
|
+
## Approach
|
|
49
|
+
|
|
50
|
+
1. **Add `legacy_schema()` to `config.py`**
|
|
51
|
+
- `Schema(raw=HeadersNormal(), cycle=HeadersSummary(), step=HeadersStepTable())`.
|
|
52
|
+
- Docstring: bridge/legacy callers only; engine uses `default_schema()`.
|
|
53
|
+
- Import header classes from `cellpycore.legacy` (lazy or top-level — match
|
|
54
|
+
existing `config.py` style).
|
|
55
|
+
|
|
56
|
+
2. **Move `selectors.py` → `legacy_selectors.py`**
|
|
57
|
+
- Move the three functions verbatim (only change: `default_schema()` →
|
|
58
|
+
`legacy_schema()` in each `if schema is None` block).
|
|
59
|
+
- Module-level docstring: bridge-only, pandas + legacy column names required,
|
|
60
|
+
not for native `CellpyCellCore` / `default_schema()` consumers.
|
|
61
|
+
- Delete `src/cellpycore/selectors.py`.
|
|
62
|
+
|
|
63
|
+
3. **Deduplicate test helper**
|
|
64
|
+
- `tests/test_golden.py`: replace `_legacy_schema()` with
|
|
65
|
+
`config.legacy_schema()`.
|
|
66
|
+
|
|
67
|
+
4. **Update `tests/test_schema.py`**
|
|
68
|
+
- Drop `selectors` import.
|
|
69
|
+
- Move `test_no_legacy_selector_functions` to new test file (or delete if
|
|
70
|
+
module gone — function removal is already covered by #45; optional thin
|
|
71
|
+
assert that `legacy_selectors` has no `create_selector`).
|
|
72
|
+
|
|
73
|
+
5. **Add `tests/test_legacy_selectors.py`**
|
|
74
|
+
- **Unit (always run):** minimal legacy-named pandas raw + step tables;
|
|
75
|
+
assert `get_step_numbers` dict keys/values, `get_cycle_numbers` without
|
|
76
|
+
rate filter, `get_rates` columns; confirm `schema=None` uses
|
|
77
|
+
`legacy_schema()` (no `AttributeError`).
|
|
78
|
+
- **Golden (skipif parquet missing):** reuse `test_golden._step_table()` +
|
|
79
|
+
`CYCLER_CC_*` constants; call `get_step_numbers("charge")`,
|
|
80
|
+
`get_cycle_numbers()`, `get_rates()` on real legacy-shaped step table;
|
|
81
|
+
assert cycle count matches `CYCLER_CC_N_CYCLES` and charge steps exist
|
|
82
|
+
for cycle 1.
|
|
83
|
+
|
|
84
|
+
6. **Docs touch-up**
|
|
85
|
+
- `this-project.md`: selectors line → "bridge-only in `legacy_selectors.py`,
|
|
86
|
+
requires `legacy_schema()`".
|
|
87
|
+
- Optional one-liner in `code-review-2026-07.md` A1 noting resolution via #67
|
|
88
|
+
(no rewrite of the report).
|
|
89
|
+
|
|
90
|
+
## Files to touch
|
|
91
|
+
|
|
92
|
+
| File | Change |
|
|
93
|
+
|------|--------|
|
|
94
|
+
| `src/cellpycore/config.py` | Add `legacy_schema()` |
|
|
95
|
+
| `src/cellpycore/legacy_selectors.py` | New — moved functions + module docstring |
|
|
96
|
+
| `src/cellpycore/selectors.py` | Delete |
|
|
97
|
+
| `tests/test_legacy_selectors.py` | New — unit + golden tests |
|
|
98
|
+
| `tests/test_golden.py` | Use `legacy_schema()` |
|
|
99
|
+
| `tests/test_schema.py` | Remove `selectors` import; adjust/remove selector asserts |
|
|
100
|
+
| `.issueflows/04-designs-and-guides/this-project.md` | Update non-goals line |
|
|
101
|
+
|
|
102
|
+
## Test strategy
|
|
103
|
+
|
|
104
|
+
```bash
|
|
105
|
+
uv run pytest tests/test_legacy_selectors.py -v
|
|
106
|
+
uv run pytest # full suite green
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
Golden test uses same `pytest.mark.skipif` + `CYCLER_CC_RAW` pattern as
|
|
110
|
+
`test_golden.py`.
|
|
111
|
+
|
|
112
|
+
## Open questions
|
|
113
|
+
|
|
114
|
+
None — all branches resolved in grill-me.
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
# Issue #67 status: selectors → bridge-only `legacy_selectors`
|
|
2
|
+
|
|
3
|
+
- [x] Done
|
|
4
|
+
|
|
5
|
+
Plan: [issue67_plan.md](issue67_plan.md) (confirmed 2026-07-03, grill-me)
|
|
6
|
+
|
|
7
|
+
## What's done
|
|
8
|
+
|
|
9
|
+
- Added `config.legacy_schema()` (lazy import of legacy header classes).
|
|
10
|
+
- Moved three functions to `src/cellpycore/legacy_selectors.py`; deleted `selectors.py`.
|
|
11
|
+
- `tests/test_legacy_selectors.py` — unit tests (always run) + golden smoke (`skipif`).
|
|
12
|
+
- `tests/test_golden.py` — uses shared `legacy_schema()`; dropped private `_legacy_schema()`.
|
|
13
|
+
- `tests/test_schema.py` — removed `selectors` import and selector asserts.
|
|
14
|
+
- Docs: `this-project.md`, `code-review-2026-07.md` A1 resolution note.
|
|
15
|
+
- Suite green: 123 passed (+ 3 deselected benchmarks).
|
|
16
|
+
|
|
17
|
+
## Remaining work
|
|
18
|
+
|
|
19
|
+
None.
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
# Issue #68: Units fallback: replace crashing data.<attr> fallback with explicit values or CellMeta
|
|
2
|
+
|
|
3
|
+
Source: https://github.com/cellpy/cellpy-core/issues/68
|
|
4
|
+
|
|
5
|
+
## Original issue text
|
|
6
|
+
|
|
7
|
+
Deferred from #66 (code review 2026-07, item D4/A2).
|
|
8
|
+
|
|
9
|
+
`units.get_converter_to_specific` reads `data.raw_units`, `data.mass`, `data.active_electrode_area`, `data.volume`; `nominal_capacity_as_absolute` reads `data.nom_cap_specifics`, `data.nom_cap`. The core `Data` class has none of these attributes, so the fallback path (taken whenever a caller omits `specific_converters` in `add_scaled_summary_columns`) raises `AttributeError` for standalone cellpy-core users.
|
|
10
|
+
|
|
11
|
+
Make these functions take explicit values or a `metadata.CellMeta` (which already has `mass`, `active_electrode_area`, `nom_cap`, `nom_cap_specifics`) — a natural fit with the metadata-boundary decision. Also remove the pointless `try/except Exception: raise` block in `nominal_capacity_as_absolute`.
|
|
12
|
+
|
|
13
|
+
See `.issueflows/04-designs-and-guides/code-review-2026-07.md` (A2, D4).
|