cellpycore 0.1.1__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.
Files changed (128) hide show
  1. cellpycore-0.1.1/.aliases +56 -0
  2. cellpycore-0.1.1/.cursor/rules/cellpy-core-migration.mdc +28 -0
  3. cellpycore-0.1.1/.cursor/rules/graphify.mdc +10 -0
  4. cellpycore-0.1.1/.cursor/rules/issueflow-rules.mdc +203 -0
  5. cellpycore-0.1.1/.cursor/rules/kiss.mdc +101 -0
  6. cellpycore-0.1.1/.cursor/rules/this-project.mdc +41 -0
  7. cellpycore-0.1.1/.cursor/skills/caveman/SKILL.md +62 -0
  8. cellpycore-0.1.1/.cursor/skills/grill-me/SKILL.md +56 -0
  9. cellpycore-0.1.1/.cursor/skills/iflow/SKILL.md +64 -0
  10. cellpycore-0.1.1/.cursor/skills/iflow-cleanup/SKILL.md +44 -0
  11. cellpycore-0.1.1/.cursor/skills/iflow-close/SKILL.md +69 -0
  12. cellpycore-0.1.1/.cursor/skills/iflow-comments/SKILL.md +96 -0
  13. cellpycore-0.1.1/.cursor/skills/iflow-fix/SKILL.md +64 -0
  14. cellpycore-0.1.1/.cursor/skills/iflow-graphify/SKILL.md +67 -0
  15. cellpycore-0.1.1/.cursor/skills/iflow-history-update/SKILL.md +84 -0
  16. cellpycore-0.1.1/.cursor/skills/iflow-init/SKILL.md +83 -0
  17. cellpycore-0.1.1/.cursor/skills/iflow-pause/SKILL.md +44 -0
  18. cellpycore-0.1.1/.cursor/skills/iflow-pick/SKILL.md +59 -0
  19. cellpycore-0.1.1/.cursor/skills/iflow-plan/SKILL.md +68 -0
  20. cellpycore-0.1.1/.cursor/skills/iflow-start/SKILL.md +60 -0
  21. cellpycore-0.1.1/.cursor/skills/iflow-status/SKILL.md +54 -0
  22. cellpycore-0.1.1/.cursor/skills/iflow-version-bump/SKILL.md +67 -0
  23. cellpycore-0.1.1/.cursor/skills/iflow-yolo/SKILL.md +49 -0
  24. cellpycore-0.1.1/.gitignore +182 -0
  25. cellpycore-0.1.1/.issueflows/00-tools/.gitkeep +0 -0
  26. cellpycore-0.1.1/.issueflows/00-tools/README.md +29 -0
  27. cellpycore-0.1.1/.issueflows/01-current-issues/.gitkeep +0 -0
  28. cellpycore-0.1.1/.issueflows/02-partly-solved-issues/.gitkeep +0 -0
  29. cellpycore-0.1.1/.issueflows/02-partly-solved-issues/issue44_original.md +27 -0
  30. cellpycore-0.1.1/.issueflows/02-partly-solved-issues/issue44_status.md +16 -0
  31. cellpycore-0.1.1/.issueflows/03-solved-issues/.gitkeep +0 -0
  32. cellpycore-0.1.1/.issueflows/03-solved-issues/issue10_original.md +7 -0
  33. cellpycore-0.1.1/.issueflows/03-solved-issues/issue10_plan.md +80 -0
  34. cellpycore-0.1.1/.issueflows/03-solved-issues/issue10_status.md +24 -0
  35. cellpycore-0.1.1/.issueflows/03-solved-issues/issue12_original.md +50 -0
  36. cellpycore-0.1.1/.issueflows/03-solved-issues/issue12_plan.md +215 -0
  37. cellpycore-0.1.1/.issueflows/03-solved-issues/issue12_status.md +57 -0
  38. cellpycore-0.1.1/.issueflows/03-solved-issues/issue13_original.md +39 -0
  39. cellpycore-0.1.1/.issueflows/03-solved-issues/issue13_plan.md +146 -0
  40. cellpycore-0.1.1/.issueflows/03-solved-issues/issue13_status.md +123 -0
  41. cellpycore-0.1.1/.issueflows/03-solved-issues/issue21_original.md +24 -0
  42. cellpycore-0.1.1/.issueflows/03-solved-issues/issue21_plan.md +137 -0
  43. cellpycore-0.1.1/.issueflows/03-solved-issues/issue21_status.md +43 -0
  44. cellpycore-0.1.1/.issueflows/03-solved-issues/issue22_original.md +20 -0
  45. cellpycore-0.1.1/.issueflows/03-solved-issues/issue22_plan.md +77 -0
  46. cellpycore-0.1.1/.issueflows/03-solved-issues/issue22_status.md +36 -0
  47. cellpycore-0.1.1/.issueflows/03-solved-issues/issue23_original.md +24 -0
  48. cellpycore-0.1.1/.issueflows/03-solved-issues/issue23_plan.md +154 -0
  49. cellpycore-0.1.1/.issueflows/03-solved-issues/issue23_status.md +48 -0
  50. cellpycore-0.1.1/.issueflows/03-solved-issues/issue24_original.md +7 -0
  51. cellpycore-0.1.1/.issueflows/03-solved-issues/issue24_status.md +47 -0
  52. cellpycore-0.1.1/.issueflows/03-solved-issues/issue29_original.md +12 -0
  53. cellpycore-0.1.1/.issueflows/03-solved-issues/issue29_plan.md +118 -0
  54. cellpycore-0.1.1/.issueflows/03-solved-issues/issue29_status.md +50 -0
  55. cellpycore-0.1.1/.issueflows/03-solved-issues/issue30_original.md +13 -0
  56. cellpycore-0.1.1/.issueflows/03-solved-issues/issue30_plan.md +124 -0
  57. cellpycore-0.1.1/.issueflows/03-solved-issues/issue30_status.md +52 -0
  58. cellpycore-0.1.1/.issueflows/03-solved-issues/issue32_original.md +75 -0
  59. cellpycore-0.1.1/.issueflows/03-solved-issues/issue32_plan.md +124 -0
  60. cellpycore-0.1.1/.issueflows/03-solved-issues/issue32_status.md +60 -0
  61. cellpycore-0.1.1/.issueflows/03-solved-issues/issue34_original.md +60 -0
  62. cellpycore-0.1.1/.issueflows/03-solved-issues/issue34_plan.md +58 -0
  63. cellpycore-0.1.1/.issueflows/03-solved-issues/issue36_original.md +13 -0
  64. cellpycore-0.1.1/.issueflows/03-solved-issues/issue36_status.md +23 -0
  65. cellpycore-0.1.1/.issueflows/03-solved-issues/issue39_original.md +11 -0
  66. cellpycore-0.1.1/.issueflows/03-solved-issues/issue39_plan.md +72 -0
  67. cellpycore-0.1.1/.issueflows/03-solved-issues/issue39_status.md +23 -0
  68. cellpycore-0.1.1/.issueflows/03-solved-issues/issue40_original.md +19 -0
  69. cellpycore-0.1.1/.issueflows/03-solved-issues/issue40_plan.md +111 -0
  70. cellpycore-0.1.1/.issueflows/03-solved-issues/issue40_status.md +48 -0
  71. cellpycore-0.1.1/.issueflows/03-solved-issues/issue41_original.md +22 -0
  72. cellpycore-0.1.1/.issueflows/03-solved-issues/issue41_plan.md +130 -0
  73. cellpycore-0.1.1/.issueflows/03-solved-issues/issue41_status.md +36 -0
  74. cellpycore-0.1.1/.issueflows/03-solved-issues/issue42_original.md +19 -0
  75. cellpycore-0.1.1/.issueflows/03-solved-issues/issue42_plan.md +85 -0
  76. cellpycore-0.1.1/.issueflows/03-solved-issues/issue42_status.md +28 -0
  77. cellpycore-0.1.1/.issueflows/03-solved-issues/issue43_original.md +15 -0
  78. cellpycore-0.1.1/.issueflows/03-solved-issues/issue43_plan.md +104 -0
  79. cellpycore-0.1.1/.issueflows/03-solved-issues/issue43_status.md +36 -0
  80. cellpycore-0.1.1/.issueflows/03-solved-issues/issue50_original.md +20 -0
  81. cellpycore-0.1.1/.issueflows/03-solved-issues/issue50_plan.md +25 -0
  82. cellpycore-0.1.1/.issueflows/03-solved-issues/issue50_status.md +20 -0
  83. cellpycore-0.1.1/.issueflows/04-designs-and-guides/.gitkeep +0 -0
  84. cellpycore-0.1.1/.issueflows/04-designs-and-guides/cellpy-core-integration-into-cellpy.md +132 -0
  85. cellpycore-0.1.1/.issueflows/04-designs-and-guides/cellpy-core-integration-roadmap.md +351 -0
  86. cellpycore-0.1.1/.issueflows/04-designs-and-guides/cellpy-core-migration.md +122 -0
  87. cellpycore-0.1.1/.issueflows/04-designs-and-guides/code-review-2026-07.md +193 -0
  88. cellpycore-0.1.1/.issueflows/04-designs-and-guides/column-headers-review.md +148 -0
  89. cellpycore-0.1.1/.issueflows/04-designs-and-guides/metadata-scaffolding.md +58 -0
  90. cellpycore-0.1.1/.issueflows/04-designs-and-guides/selector-dead-code-deferral.md +39 -0
  91. cellpycore-0.1.1/.issueflows/04-designs-and-guides/step-table-polars-migration.md +234 -0
  92. cellpycore-0.1.1/.issueflows/04-designs-and-guides/summary-extractors.md +60 -0
  93. cellpycore-0.1.1/.issueflows/04-designs-and-guides/test-data-and-fixtures.md +86 -0
  94. cellpycore-0.1.1/.issueflows/04-designs-and-guides/test-metadata-and-merging.md +67 -0
  95. cellpycore-0.1.1/.issueflows/04-designs-and-guides/this-project.md +32 -0
  96. cellpycore-0.1.1/.issueflows/config.toml +12 -0
  97. cellpycore-0.1.1/.python-version +1 -0
  98. cellpycore-0.1.1/.vscode/settings.json +7 -0
  99. cellpycore-0.1.1/AGENTS.md +253 -0
  100. cellpycore-0.1.1/HISTORY.md +23 -0
  101. cellpycore-0.1.1/LICENSE +21 -0
  102. cellpycore-0.1.1/PKG-INFO +90 -0
  103. cellpycore-0.1.1/README.md +66 -0
  104. cellpycore-0.1.1/cellpy-core.code-workspace +14 -0
  105. cellpycore-0.1.1/graphify-out/.graphify_labels.json +63 -0
  106. cellpycore-0.1.1/graphify-out/.graphify_root +1 -0
  107. cellpycore-0.1.1/graphify-out/GRAPH_REPORT.md +291 -0
  108. cellpycore-0.1.1/graphify-out/graph.html +305 -0
  109. cellpycore-0.1.1/graphify-out/graph.json +18767 -0
  110. cellpycore-0.1.1/graphify-out/manifest.json +194 -0
  111. cellpycore-0.1.1/pyproject.toml +79 -0
  112. cellpycore-0.1.1/scratch.db +0 -0
  113. cellpycore-0.1.1/src/cellpycore/__init__.py +0 -0
  114. cellpycore-0.1.1/src/cellpycore/_helpers.py +199 -0
  115. cellpycore-0.1.1/src/cellpycore/cell_core.py +696 -0
  116. cellpycore-0.1.1/src/cellpycore/config.py +674 -0
  117. cellpycore-0.1.1/src/cellpycore/extractors.py +156 -0
  118. cellpycore-0.1.1/src/cellpycore/header_mapping.py +267 -0
  119. cellpycore-0.1.1/src/cellpycore/legacy.py +336 -0
  120. cellpycore-0.1.1/src/cellpycore/metadata/__init__.py +59 -0
  121. cellpycore-0.1.1/src/cellpycore/metadata/io.py +192 -0
  122. cellpycore-0.1.1/src/cellpycore/metadata/models.py +238 -0
  123. cellpycore-0.1.1/src/cellpycore/selectors.py +470 -0
  124. cellpycore-0.1.1/src/cellpycore/settings_base.py +98 -0
  125. cellpycore-0.1.1/src/cellpycore/summarizers.py +903 -0
  126. cellpycore-0.1.1/src/cellpycore/timestamps.py +128 -0
  127. cellpycore-0.1.1/src/cellpycore/units.py +257 -0
  128. cellpycore-0.1.1/uv.lock +1144 -0
@@ -0,0 +1,56 @@
1
+ # `release [patch|minor|major]`
2
+ #
3
+ # Cuts a GitHub release whose tag matches the *committed* project version, so
4
+ # the git history and the published tags can never drift apart.
5
+ #
6
+ # release # tag the already-committed version (e.g. after `/issue-close patch`)
7
+ # release patch # bump -> commit -> push -> tag, all in one consistent step
8
+ # release minor|major # same, for the other bump levels
9
+ #
10
+ # Guards:
11
+ # - refuses to tag while a version bump is still uncommitted (the old alias
12
+ # silently dropped uncommitted bumps from history -> tag/repo drift);
13
+ # - refuses if the target tag already exists locally or on origin
14
+ # (this is what produced the confusing "tag already exists" error after a
15
+ # double bump from `/issue-close` + the release ritual).
16
+ release() {
17
+ local level="${1:-}"
18
+
19
+ if [ -n "$level" ]; then
20
+ case "$level" in
21
+ patch|minor|major) ;;
22
+ *) echo "release: unknown bump level '$level' (use patch|minor|major)"; return 1 ;;
23
+ esac
24
+ if [ -n "$(git status --porcelain)" ]; then
25
+ echo "release: working tree is not clean; commit or stash before bumping."; return 1
26
+ fi
27
+ uv version --bump "$level" || return 1
28
+ fi
29
+
30
+ # Derive the version from pyproject AFTER any bump.
31
+ local ver
32
+ ver="$(python -c "import tomllib; print(tomllib.load(open('pyproject.toml','rb'))['project']['version'])")" || return 1
33
+ local tag="v$ver"
34
+
35
+ # Commit the bump (if we made one) so the tag points at committed history.
36
+ if [ -n "$(git status --porcelain -- pyproject.toml uv.lock)" ]; then
37
+ if [ -n "$level" ]; then
38
+ git add pyproject.toml uv.lock || return 1
39
+ git commit -m "$tag" || return 1
40
+ else
41
+ echo "release: pyproject.toml/uv.lock has an uncommitted version change."
42
+ echo " commit it first, or run: release patch|minor|major"
43
+ return 1
44
+ fi
45
+ fi
46
+
47
+ # Never re-create an existing tag.
48
+ if git rev-parse -q --verify "refs/tags/$tag" >/dev/null 2>&1 \
49
+ || git ls-remote --exit-code --tags origin "refs/tags/$tag" >/dev/null 2>&1; then
50
+ echo "release: tag $tag already exists. Bump the version first (release patch|minor|major)."
51
+ return 1
52
+ fi
53
+
54
+ git push || return 1
55
+ gh release create "$tag" --generate-notes
56
+ }
@@ -0,0 +1,28 @@
1
+ ---
2
+ description: Required reading before cross-repo cellpy <-> cellpy-core integration/migration work
3
+ alwaysApply: true
4
+ ---
5
+
6
+ # cellpy <-> cellpy-core migration
7
+
8
+ Before doing **any** work that touches the boundary between `cellpy` (jepegit/cellpy)
9
+ and `cellpy-core` (cellpy/cellpy-core) — wiring the dependency, the processing seam,
10
+ shared headers/units, test/cell metadata, or "what belongs in core" — you MUST first
11
+ read:
12
+
13
+ `.issueflows/04-designs-and-guides/cellpy-core-migration.md`
14
+ (and its companion `cellpy-core-integration-into-cellpy.md`).
15
+
16
+ Key invariants from that doc:
17
+
18
+ - **Branch, don't fork.** Integration work goes on a `cellpy` branch (optionally a
19
+ `git worktree`), never a fresh clone of cellpy.
20
+ - **Dev wiring:** cellpy uses a `[tool.uv.sources]` editable path to `../cellpy-core`
21
+ for local dev; the `git+https…@<ref>` reference in `[project.dependencies]` stays the
22
+ release/consumer truth. Pin a tag/commit for releases.
23
+ - **Parity is enforced by tests** (legacy header/unit contract tests + golden parquet
24
+ fixtures), not by vigilance.
25
+ - **Metadata boundary:** core may own metadata *scaffolding and tooling* (schemas,
26
+ `test_id`, helpers) but must NOT require populated metadata on its `Data`; attaching
27
+ real metadata to a data object is the next level's opt-in (e.g. cellpy v2.0). The
28
+ core engine must degrade gracefully when metadata is absent.
@@ -0,0 +1,10 @@
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
+ - Before answering architecture or codebase questions, read graphify-out/GRAPH_REPORT.md for god nodes and community structure
9
+ - If graphify-out/wiki/index.md exists, navigate it instead of reading raw files
10
+ - After modifying code files in this session, run `graphify update .` to keep the graph current (AST-only, no API cost)
@@ -0,0 +1,203 @@
1
+ ---
2
+ description: Issue-flow workflow rules for LLMs
3
+ globs:
4
+ alwaysApply: true
5
+ ---
6
+
7
+
8
+ # Issue-flow best practices
9
+
10
+
11
+ ## Running python
12
+
13
+ **Respect the project's existing toolchain first.** If this project already
14
+ documents how to run Python and manage dependencies — in its `README`,
15
+ `AGENTS.md`, `CLAUDE.md`, `.cursor/rules`, `environment.yml`, `pyproject.toml`,
16
+ `Makefile`, CI config, etc. — **follow that**, even where it conflicts with the
17
+ defaults below. These rules describe issue-flow's *default* assumptions, not a
18
+ mandate to override a project that has already chosen differently.
19
+
20
+ The one tool-neutral principle: **don't call bare `python ...`** — invoke Python
21
+ through the project's environment (its runner, or an activated virtualenv/conda
22
+ env) so scripts and tests see the right interpreter and dependencies.
23
+
24
+ ### If the project uses conda
25
+
26
+ When the project documents a conda environment, run **all** Python commands —
27
+ scripts **and `pytest`** — inside the **activated conda environment**. Do **not**
28
+ substitute `uv run`.
29
+
30
+ ```bash
31
+ # Either activate the environment first…
32
+ conda activate <env-name>
33
+ python run_script.py
34
+ pytest
35
+
36
+ # …or run one-off commands inside it:
37
+ conda run -n <env-name> pytest
38
+ ```
39
+
40
+ ### If the project uses uv (issue-flow's default)
41
+
42
+ For projects scaffolded fresh (and this is the default when nothing else is
43
+ documented), use `uv`:
44
+
45
+ ```bash
46
+ # ❌ BAD: bare interpreter
47
+ python run_script.py
48
+
49
+ # ✅ GOOD: through uv
50
+ uv run run_script.py
51
+ ```
52
+
53
+ **Package management with `uv`**
54
+
55
+ - Install, synchronize, and lock dependencies with `uv`; don't reach for `pip`,
56
+ `pip-tools`, or `poetry` in a uv-managed project.
57
+
58
+ ```bash
59
+ # Add or upgrade dependencies
60
+ uv add <package>
61
+
62
+ # Remove dependencies
63
+ uv remove <package>
64
+
65
+ # Reinstall all dependencies from the lock file
66
+ uv sync
67
+
68
+ # Run a script with the right environment
69
+ uv run script.py
70
+ ```
71
+
72
+ ### Other toolchains (plain venv / pip / poetry)
73
+
74
+ If the project uses something else, use whatever it documents (e.g. activate its
75
+ `.venv` and use `pip`, or run `poetry run`). Match the project; don't force `uv`.
76
+
77
+
78
+ ## Issue tracking structure
79
+
80
+ ```bash
81
+ cellpycore/
82
+ .issueflows/
83
+ 00-tools/
84
+ 01-current-issues/
85
+ issueXX_original.md
86
+ issueXX_status.md
87
+ 02-partly-solved-issues/
88
+ 03-solved-issues/
89
+ 04-designs-and-guides/
90
+ pyproject.toml
91
+ readme.md
92
+ ...
93
+ ```
94
+
95
+
96
+ ## Development information
97
+
98
+
99
+ ### Working on issues
100
+
101
+ After each iteration, update the documents in `.issueflows/01-current-issues` (should contain one file labelled `_original` with the original issue description, a `_plan` file with the confirmed approach, and supplementary status files describing what has been done, current status, and remaining work).
102
+ Use an explicit status checkbox in the status file:
103
+ - `- [x] Done` when fully resolved
104
+ - `- [ ] Done` when not fully resolved
105
+
106
+ ### Command lifecycle
107
+
108
+ If you have not chosen an issue yet, run **`/iflow-pick`** — the front door that helps you select the next issue (parked work first, else ranked open GitHub issues), creates the branch, and runs `/iflow-init` for you. It is off-path (never auto-dispatched).
109
+
110
+ If you just want the next right step, run **`/iflow`** — it detects state (by file presence under `.issueflows/01-current-issues/` and the status-file `- [x] Done` marker) and dispatches to `/iflow-init`, `/iflow-plan`, `/iflow-start`, or `/iflow-close`. It never auto-dispatches to `/iflow-pick`, `/iflow-pause`, `/iflow-cleanup`, or `/iflow-yolo` — those stay explicit.
111
+
112
+ The full slash-command lifecycle is:
113
+
114
+ 1. **`/iflow-init`** — capture the GitHub issue as `issue<N>_original.md`.
115
+ 2. **`/iflow-plan`** — design the approach in `issue<N>_plan.md` and get explicit confirmation before any code changes.
116
+ 3. **`/iflow-start`** — implement the confirmed plan. Asks to run `/iflow-plan` first if the plan file is missing.
117
+ 4. **`/iflow-pause`** *(optional)* — park work mid-stream: update status, move the issue group to `02-partly-solved-issues`, optional WIP commit.
118
+ 5. **`/iflow-close`** — tests, optional `uv version --bump`, status update, commit, push, PR. Does not delete branches.
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
+
121
+ `/iflow-yolo` chains `init → plan → start → close` for small, low-risk issues with up-front safeguards (clean tree, passing tests, single consolidated confirm).
122
+
123
+ `/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
+
125
+ `/iflow-status` prints a **read-only** overview of where every issue stands — the local tracking state under `.issueflows/` (focus / parked / solved) plus open GitHub issues cross-referenced against it. It is off-path (never auto-dispatched) and changes nothing.
126
+
127
+ > On tools without project slash commands (e.g. Codex CLI), invoke the mirrored Agent Skills instead (for example `iflow-init` in place of `/iflow-init`).
128
+
129
+ ### When finishing an issue
130
+
131
+ If the issue is fully resolved (no additional subtasks present), move the original, plan, and status markdown files to `.issueflows/03-solved-issues`. Else, move them to `.issueflows/02-partly-solved-issues`.
132
+
133
+ ### Scripts that can help us when working on issues
134
+
135
+ `.issueflows/00-tools/` is the project's durable toolbox of reusable helper scripts, with a `README.md` index describing each one.
136
+
137
+ - **Check it first.** Before writing a new one-off helper for an issue, skim the `00-tools/README.md` index and the folder — a suitable tool may already exist.
138
+ - **Contribute back.** If you build something during an issue that could help on a future one, save it into `.issueflows/00-tools/` and add a one-line entry to the index (name, what it does, when to use it) so the next agent knows whether to reach for it.
139
+
140
+
141
+
142
+ ### Optional response styles
143
+
144
+ A **caveman** Agent Skill is installed under `.cursor/skills/caveman/` and
145
+ is **on by default for this project**: reply in the terse, "token-greedy" caveman
146
+ style — keep all technical substance, drop filler, articles, and pleasantries —
147
+ from the first message of every session, re-arming each new session. Turn it off
148
+ for the rest of a session with **"stop caveman"** or **"normal mode"**. Code,
149
+ commits, PRs, security warnings, and destructive-action confirmations are always
150
+ written in normal prose, never caveman. (This default comes from
151
+ `caveman_default = true` under `[issueflow]` in `.issueflows/config.toml`;
152
+ set it to `false` and re-run `issue-flow update` to make caveman opt-in per
153
+ session instead.)
154
+
155
+
156
+
157
+
158
+ ### Planning aids
159
+
160
+ A **grill-me** Agent Skill is installed under `.cursor/skills/grill-me/`.
161
+ It runs a relentless planning interview that stress-tests a plan or design —
162
+ one question at a time, each with a recommended answer — until every branch of
163
+ the decision tree is resolved. It is **off by default** and only kicks in when
164
+ you ask for it (e.g. "grill me", "poke holes in this"). Turn it off with **"stop
165
+ grilling"** or **"normal mode"**. (To make grilling on by default during planning
166
+ for this project, set `grill_me_default = true` under `[issueflow]` in
167
+ `.issueflows/config.toml` and re-run `issue-flow update`.)
168
+
169
+
170
+
171
+ ### Designs and guides
172
+
173
+ Long-lived design docs, design decisions, and project "good practices" live under `.issueflows/04-designs-and-guides/`. Unlike the issue folders, content here is **not** tied to a single issue and is **not** archived when an issue closes — it is the project's durable memory.
174
+
175
+ - **Project brief:** if `.issueflows/04-designs-and-guides/this-project.md` exists, read it early for project-specific context (what the repo is, stack/runtime, how to run/test, conventions, entry points, and known limitations).
176
+ - **Before planning or implementing**, skim `.issueflows/04-designs-and-guides/` for existing docs relevant to the current issue and follow them (cite them in the plan when they influence the approach).
177
+ - **When a non-trivial design decision is made** during `/iflow-plan` or `/iflow-start`, add or update a markdown file here. Keep entries terse: context, the decision, alternatives considered, and a link back to the issue.
178
+ - **Never overwritten by `issue-flow update`.** The folder is recreated if missing, but existing files are left alone.
179
+
180
+
181
+ ### Branch hygiene
182
+
183
+ - Do issue work on an **issue branch** named like `<N>-<short-slug>`, not on the default branch.
184
+ - Before starting or continuing work on an issue branch, run `git fetch --prune` and check where the branch sits relative to `origin/<default>` (ahead/behind). A branch that is "several commits ahead" after a merged PR usually means the PR was squash-merged and the local branch is stale.
185
+ - **Assume squash-merges on GitHub.** After a PR merges: run **`/iflow-cleanup`** — it switches to the default branch, runs `git pull --ff-only`, `git fetch --prune`, and deletes merged local branches with `git branch -d <branch>` under a single consolidated confirm (never `-D` automatically). `/iflow-close` no longer does this step itself.
186
+ - If an issue is already archived under `.issueflows/02-partly-solved-issues` or `.issueflows/03-solved-issues`, the matching local branch is stale; don't resume work on it silently — switch back to the default branch and, if the issue really needs re-opening, do it deliberately through `/iflow-init` (which will ask for a second confirmation).
187
+
188
+
189
+ ### Folder hygiene for `.issueflows/01-current-issues`
190
+
191
+ - Only the **focus issue** (the one currently being worked on) should live in `.issueflows/01-current-issues`.
192
+ - `/iflow-init` and `/iflow-start` both sweep that folder automatically: every `issue<n>_*` group **other than the focus issue** is moved to `.issueflows/03-solved-issues` if a status file contains `- [x] Done`, otherwise to `.issueflows/02-partly-solved-issues`. Keep status files accurate so the sweep routes them correctly.
193
+
194
+
195
+ ### Knowledge graph (optional, via [graphify](https://iflow-graphify.net))
196
+
197
+ If a `graphify-out/` folder exists in the project root, the project has the optional [graphify](https://iflow-graphify.net) integration enabled and a knowledge graph is available alongside the source.
198
+
199
+ - **Before grepping**, skim `graphify-out/GRAPH_REPORT.md`. It surfaces god-nodes (most-connected concepts), surprising cross-module connections, and suggested questions the graph can answer — often a faster way to locate the files an issue actually touches than full-text search.
200
+ - **`/iflow-graphify`** (slash command) or **`issue-flow graphify`** (CLI) rebuild the graph. With no extra args this runs `graphify update <project>` — AST-only, **no LLM API key needed**. For richer semantic relationships (cross-file links surfaced by an LLM pass), run `issue-flow graphify extract` after setting `GEMINI_API_KEY` / `ANTHROPIC_API_KEY` / `OPENAI_API_KEY` / `MOONSHOT_API_KEY` (or pass `--backend ollama` for a local LLM). Other subcommands: `watch` (live), `cluster-only --no-viz` (re-cluster). Trailing flags pass through verbatim. Your agent's own LLM cannot be reused by subprocesses; graphify needs its own backend.
201
+ - `/iflow-graphify` is **off-path**: never auto-dispatched by `/iflow`, `/iflow-start`, or `/iflow-close`. It is the user's call. `/iflow-start` may *suggest* skimming `GRAPH_REPORT.md`; `/iflow-close` may *suggest* a rebuild after large structural changes — neither runs `graphify` automatically.
202
+ - If `graphify-out/` is not present, ignore graph-related guidance entirely. The integration is opt-in (install with `uv tool install graphifyy`, then `issue-flow update` to register the graphify skill).
203
+
@@ -0,0 +1,101 @@
1
+ ---
2
+ description:
3
+ globs:
4
+ alwaysApply: true
5
+ ---
6
+
7
+ <!--
8
+ Description: Global KISS development rules to prevent over-engineering and enforce simple, maintainable solutions across all projects.
9
+ Auto-attach: true
10
+ -->
11
+
12
+ KISS PRIME DIRECTIVE
13
+ Keep every change simple, evidence-based, and reproducible.
14
+
15
+ Solution Design and Scope Control
16
+ - **Scope-First Principle**: Before coding, ask "What's the simplest thing that could work?"
17
+ - **File Budget**: For tasks <50 lines total, use MAX 1 existing file or create MAX 1 new file
18
+ - **Dependency Budget**: Don't add dependencies for stdlib-solvable operations
19
+ - **Abstraction Budget**: No classes/modules/frameworks for one-time operations
20
+ - **Research Time-Box**: MAX 10 minutes researching before trying obvious solution
21
+
22
+ Complexity Prevention
23
+ - **Start with stdlib**: Can `shutil`, `pathlib`, `os`, `json` solve this? Do that first.
24
+ - **Question every layer**: Do I need a function/class/module? Usually no for <20 line operations.
25
+ - **Match project scale**: Small codebases get small solutions; don't over-architect.
26
+ - **Prototype first**: Write inline/script before creating abstractions.
27
+
28
+ Before Creating Any New File:
29
+ 1. Can this be 5-10 lines added to existing file?
30
+ 2. Am I solving a problem that doesn't exist yet?
31
+ 3. Would a junior developer understand immediately?
32
+ 4. Does this match existing codebase complexity?
33
+
34
+ - No invented data or code to mask failures; focus on root cause and add tests.
35
+ - Remove dead or duplicated code promptly.
36
+ - Use Conventional Commits; prefer squash merges for clean history.
37
+
38
+ Dependencies
39
+ - Make dependencies explicit; update requirements.txt or lockfiles immediately on changes.
40
+ - List only third-party packages (exclude standard library).
41
+ - Pin minimum compatible versions for stability; use a lockfile (e.g., pip-tools/uv) when reproducibility is required.
42
+
43
+ Testing
44
+ - Run tests after substantive edits; keep the suite green.
45
+ - Add tests for new behavior and edge cases before or with the change.
46
+ - Use automated testing (unit/integration/e2e as appropriate); prefer CI to enforce.
47
+
48
+ Logging and Error Handling
49
+ - Use project loggers, not prints; include actionable context (counts, paths, IDs).
50
+ - Fail fast on invalid config or inputs; never silently auto-correct.
51
+ - Follow log levels best practices (debug, info, warning, error, critical).
52
+
53
+ IO and Artifacts
54
+ - Treat input data directories as read-only; write derived artifacts to an output/ folder.
55
+ - Avoid committing large generated files or runtime outputs to version control.
56
+ - Project rules may redefine exact paths and modes (dry-run/live, backups).
57
+
58
+ Platform and Paths
59
+ - Avoid hard-coded, user-specific absolute paths; externalize to config.
60
+ - Use cross-platform path APIs for portability.
61
+
62
+ Code Style and Quality
63
+ - Match project style consistently; use automated tools (linters/formatters) when available.
64
+ - Prefer early returns, shallow nesting, and meaningful naming.
65
+ - Avoid bare except; handle exceptions explicitly.
66
+ - Maintain concise docstrings focused on behavior and intent.
67
+
68
+ Operational Safeguards (minimal)
69
+ - Dry-run and backups
70
+ - Do: provide a dry-run that exercises the flow without mutating prod; create and verify a backup before writes; log backup paths and intended changes.
71
+ - Don't: modify prod without a backup/restore path; label runs "dry" if they mutate state.
72
+ - Feature-gated behavior
73
+ - Do: ship new behavior behind a default-off flag; add tests for old/new paths; document enable/disable steps.
74
+ - Don't: change defaults silently; ship behavior that cannot be turned off.
75
+ - Config/schema safety
76
+ - Do: validate config strictly (types, required keys, unknown keys = error); version config/schema when behavior changes; make migrations reversible and tested.
77
+ - Don't: auto-migrate without backups/logs; accept unknown config keys; make irreversible schema changes.
78
+
79
+ Collaboration and Workflow
80
+ - Read project docs and tests before changes; preserve stated invariants.
81
+ - Encourage peer reviews for risky or substantial changes.
82
+ - Propose and document plans for risky IO/DB changes; provide OS-appropriate, non-interactive commands.
83
+
84
+ Security and Scalability
85
+ - Integrate basic security hygiene (e.g., dependency scans like pip-audit/dependabot).
86
+ - Patch vulnerabilities promptly; remove unused deps.
87
+ - Prefer simple, modular designs; avoid microservices or heavy patterns unless clearly justified.
88
+
89
+ Documentation Standards
90
+ 1) Project-Level README
91
+ - Include: purpose/scope, setup, example usage, directory structure, and ownership/contact.
92
+
93
+ 2) Configuration Reference and Runbook
94
+ - Include: config keys with types/defaults, example configs, dry-run/live procedures, backup/restore steps, and common recovery actions.
95
+
96
+ 3) Change Logs and Versioning
97
+ - Maintain a CHANGELOG.md or use tags/releases to track features, fixes, and breaking changes.
98
+
99
+ Conflict Resolution
100
+ - This global rule is the default. Project rules in .cursor/rules may override specifics (paths, workflows, tooling).
101
+
@@ -0,0 +1,41 @@
1
+ ---
2
+ description: cellpy-core project overview, environment/tooling (uv, .venv), repo layout, and docstring conventions.
3
+ globs:
4
+ alwaysApply: true
5
+ ---
6
+
7
+
8
+ This is a python project. And it uses a python environment (.venv). Rember to activate it! We
9
+ also have uv installed. Use uv if you want. If not, just do the normal "source .venv/Scripts/activate" (assuming you are in the top directory). The project uses the common structure for python projects, where the main code is in the src/cellpycore folder and tests are in the tests folder. And docs are in the docs folder. Again, assuming you are in the top directory of this repository.
10
+
11
+ This library is to be used as a core part of a larger library (cellpy) that should read cell testing data from battery testers. It implements the core functionallity: finding all the steps and cycles and creating tables containing information pr step or pr cycle. It should run fast. And it should be easy for developers of the full cellpy library to use and extend it. It should be thread safe. It should be understandable.
12
+
13
+ ## Docstrings
14
+
15
+ Use **Google-style** docstrings everywhere (this matches both `cellpy-core` and the old `cellpy` codebase). Do not use NumPy-style (underlined section headers) or plain reST field lists (`:param:` / `:return:`).
16
+
17
+ Rules:
18
+ - Start with a one-line summary, then an optional blank line and longer description.
19
+ - Use these section headers (a header line ending in a colon, followed by an indented block): `Args:`, `Returns:`, `Raises:`, `Yields:`, `Attributes:` (for classes / enums), `Example:`, `Note:`.
20
+ - In `Args:`, write each parameter as `name (type): description`. The `(type)` is optional when the signature already has a type hint, but stay consistent within a function.
21
+ - Wrap code-like tokens (types, values, identifiers) in double backticks, e.g. ``` ``pandas.DataFrame`` ```, ``` ``"anode"`` ```.
22
+ - Keep them concise and focused on behavior and intent, not a restatement of the code.
23
+
24
+ Example:
25
+
26
+ ```python
27
+ def find_steps(data, schema=None):
28
+ """Find all steps in the raw data and build the step table.
29
+
30
+ Args:
31
+ data (Data): The data object to process.
32
+ schema: The column-header schema to use. Defaults to the native
33
+ cellpy-core schema when not provided.
34
+
35
+ Returns:
36
+ Data: The data object with the step table added.
37
+
38
+ Raises:
39
+ NoDataFound: If the data object has no raw data.
40
+ """
41
+ ```
@@ -0,0 +1,62 @@
1
+ ---
2
+ name: caveman
3
+ description: >-
4
+ Respond in a terse "smart caveman" style that keeps all technical substance
5
+ but drops filler, articles, and pleasantries. Use when the user asks for
6
+ caveman mode, token-greedy / terse answers, or says "be brief" / "stop
7
+ wasting tokens". Stays active across the session once on; off via "stop
8
+ caveman" / "normal mode".
9
+ ---
10
+
11
+ # Be token greedy - as a caveman
12
+
13
+ Respond terse like smart caveman. All technical substance stay. Only fluff die.
14
+
15
+ ## Persistence
16
+
17
+ ACTIVE EVERY RESPONSE once turned on. No revert after many turns. No filler drift. Still active if unsure. Off only: "stop caveman" / "normal mode".
18
+
19
+ ## Rules
20
+
21
+ Drop: articles (a/an/the), filler (just/really/basically/actually/simply), pleasantries (sure/certainly/of course/happy to), hedging. Fragments OK. Short synonyms (big not extensive, fix not "implement a solution for"). No tool-call narration, no decorative tables/emoji, no dumping long raw error logs unless asked — quote shortest decisive line. Standard well-known tech acronyms OK (DB/API/HTTP); never invent new abbreviations reader can't decode. Technical terms exact. Code blocks unchanged. Errors quoted exact.
22
+
23
+ No self-reference. Never name or announce the style. No "caveman mode on", "me caveman think", no third-person caveman tags. Output caveman-only — never normal answer plus "Caveman:" recap. Exception: user explicitly ask what the mode is.
24
+
25
+ Pattern: `[thing] [action] [reason]. [next step].`
26
+
27
+ Not: "Sure! I'd be happy to help you with that. The issue you're experiencing is likely caused by..."
28
+ Yes: "Bug in auth middleware. Token expiry check use `<` not `<=`. Fix:"
29
+
30
+ English only. Caveman applies to English output; do not garble other languages.
31
+
32
+ ## Intensity
33
+
34
+ Single level: **full**. Drop articles, fragments OK, short synonyms. Classic caveman. No tool-call narration, no decorative tables/emoji, no long raw error-log dumps unless asked. Standard acronyms OK; no invented abbreviations.
35
+
36
+ Example — "Why React component re-render?"
37
+ - "New object ref each render. Inline object prop = new ref = re-render. Wrap in `useMemo`."
38
+
39
+ Example — "Explain database connection pooling."
40
+ - "Pool reuse open DB connections. No new connection per request. Skip handshake overhead."
41
+
42
+ ## Auto-Clarity
43
+
44
+ Drop caveman when:
45
+ - Security warnings
46
+ - Irreversible action confirmations
47
+ - Multi-step sequences where fragment order or omitted conjunctions risk misread
48
+ - Compression itself creates technical ambiguity (e.g., `"migrate table drop column backup first"` — order unclear without articles/conjunctions)
49
+ - User asks to clarify or repeats question
50
+
51
+ Resume caveman after clear part done.
52
+
53
+ Example — destructive op:
54
+ > **Warning:** This will permanently delete all rows in the `users` table and cannot be undone.
55
+ > ```sql
56
+ > DROP TABLE users;
57
+ > ```
58
+ > Caveman resume. Verify backup exist first.
59
+
60
+ ## Boundaries
61
+
62
+ Code/commits/PRs: write normal. "stop caveman" or "normal mode": revert. Mode persist until changed or session end.
@@ -0,0 +1,56 @@
1
+ ---
2
+ name: grill-me
3
+ description: >-
4
+ Interview the user relentlessly about a plan or design until every branch of
5
+ the decision tree is resolved, then feed the conclusions into the issue plan.
6
+ Use when the user wants to stress-test a plan, asks to "grill me", or during
7
+ /iflow-plan when grilling is turned on. Off via "stop grilling" / "normal mode".
8
+ ---
9
+
10
+ # Grill me — relentless planning interview
11
+
12
+ Interview the user about every aspect of the plan until you reach a shared,
13
+ unambiguous understanding. Walk down each branch of the design tree, resolving
14
+ dependencies between decisions one at a time. The goal is to surface hidden
15
+ assumptions and edge cases **before** they get encoded in code or written into
16
+ `.issueflows/01-current-issues/issue<N>_plan.md`.
17
+
18
+ ## When to use
19
+
20
+ - The user asks to be grilled / stress-tested ("grill me", "poke holes in this").
21
+ - During `/iflow-plan`, when grilling is active (see *Activation* below), to
22
+ pressure-test the approach before the plan file is drafted.
23
+
24
+ ## How to grill
25
+
26
+ - **One question at a time.** Never batch questions. Wait for the answer before
27
+ moving to the next branch.
28
+ - **Always recommend an answer.** For each question, give your recommended option
29
+ and a one-line rationale, so the user can accept quickly or push back.
30
+ - **Explore before asking.** If a question can be answered by reading the code,
31
+ the issue text, or `.issueflows/04-designs-and-guides/`, explore first
32
+ and confirm what you found instead of asking the user to do your homework.
33
+ - **Follow the decision tree.** Resolve upstream decisions before the ones that
34
+ depend on them; let earlier answers prune later branches.
35
+ - **Stay on scope.** Grill the issue at hand. Park genuinely separate concerns as
36
+ follow-up notes rather than expanding the interview indefinitely.
37
+ - **Know when to stop.** End when every open branch is resolved (or explicitly
38
+ deferred) and you can restate the plan without ambiguity. Summarize the agreed
39
+ decisions so they can flow straight into the plan.
40
+
41
+ ## Activation
42
+
43
+ This skill is **dormant by default**: it engages only when the user asks for it
44
+ ("grill me") or when a project turns it on for planning.
45
+
46
+ Turn it off again for the rest of a session with **"stop grilling"** or
47
+ **"normal mode"**. (To make grilling on by default during planning for this
48
+ project, set `grill_me_default = true` under `[issueflow]` in
49
+ `.issueflows/config.toml` and re-run `issue-flow update`.)
50
+
51
+
52
+ ## Boundaries
53
+
54
+ - Grilling is a **planning** aid: it questions and aligns, it does not write code.
55
+ - Hand the agreed decisions to `/iflow-plan` so they land in `issue<N>_plan.md`;
56
+ implementation still goes through `/iflow-start`.
@@ -0,0 +1,64 @@
1
+ ---
2
+ name: iflow
3
+ description: >-
4
+ Run the /iflow smart dispatcher: detect where the focus issue stands in the
5
+ lifecycle (via files in .issueflows/01-current-issues/ and
6
+ status markers) and dispatch to /iflow-init, /iflow-plan, /iflow-start, or
7
+ /iflow-close. Forwards trailing args verbatim. Never auto-dispatches to
8
+ /iflow-pause, /iflow-cleanup, or /iflow-yolo.
9
+ disable-model-invocation: true
10
+ ---
11
+
12
+ # issue-flow — iflow smart dispatcher (`/iflow`)
13
+
14
+ Follow this skill when the user wants to run **the right next step** in the issue-flow lifecycle without remembering which specific command applies.
15
+
16
+ ## When to use
17
+
18
+ - The user runs `/iflow`, mentions **iflow**, or asks "what's the next step?" during an issue-flow lifecycle.
19
+ - You want a single entry point that routes to `/iflow-init`, `/iflow-plan`, `/iflow-start`, or `/iflow-close` based on current state.
20
+
21
+ Do **not** use this skill for `/iflow-pick`, `/iflow-pause`, `/iflow-cleanup`, `/iflow-yolo`, or `/iflow-fix`. Those are explicit-only commands. (`/iflow-pick` is the front door *before* `/iflow-init`, for when no issue has been chosen yet. `/iflow-fix` runs an interactive iterative-fixes session, driven by `/iflow-fix` + `/iflow-close`.)
22
+
23
+ ## Instructions
24
+
25
+ > **CLI fast path (optional).** If the `issue-flow` CLI is on `PATH`, run
26
+ > `issue-flow agent state --json` to resolve the focus issue, its lifecycle
27
+ > stage, and the suggested `next_command` in one deterministic step (covers
28
+ > instructions 1–2), then dispatch to that command. The CLI is optional: if it
29
+ > is not installed or it errors, fall back to the manual instructions below.
30
+ > (`issue-flow` is only present when the user installed it, e.g.
31
+ > `uv tool install issue-flow`.)
32
+
33
+ 1. **Resolve the focus issue number `N`.**
34
+ - `git branch --show-current`. If it matches `^(\d+)-.+`, the leading digits are the **authoritative** `N`.
35
+ - List `issue<n>_*` groups in `.issueflows/01-current-issues/`, and also check `.issueflows/02-partly-solved-issues/` and `.issueflows/03-solved-issues/` for archived groups matching `N`.
36
+ - Pick `N` by precedence:
37
+ 1. **Branch-derived `N` wins**, regardless of whether a group for `N` exists in `01-current-issues/`. State **A** will apply when no `issue<N>_*` files are present yet. If `issue<N>_*` is archived under `02-partly-solved-issues/` or `03-solved-issues/`, warn the user that `/iflow-init`'s archived-issue guard will ask for an explicit confirmation before re-opening.
38
+ 2. No branch-derived `N`, exactly one group exists in `01-current-issues/` → use it.
39
+ 3. No branch-derived `N`, no groups at all → state **A** (dispatch `/iflow-init`; it will ask for a number).
40
+ 4. No branch-derived `N`, multiple groups → **stop and ask**.
41
+
42
+ 2. **Detect state and choose the dispatch target** (first match wins):
43
+
44
+ - **A** — no `issue<N>_original.md` (or no focus issue) → dispatch to **`/iflow-init`**. Reason: "no `*_original.md` yet".
45
+ - **B** — original exists, no `issue<N>_plan.md` → dispatch to **`/iflow-plan`**. Reason: "no plan file yet".
46
+ - **C** — plan exists, and status file is missing or its `- [x] Done` is unchecked → dispatch to **`/iflow-start`**. Reason: "plan is confirmed but status is not `- [x] Done`".
47
+ - **D** — status file contains `- [x] Done` (case-insensitive on `done`) → dispatch to **`/iflow-close`**. Reason: "status marks the issue `- [x] Done`".
48
+
49
+
50
+ 3. **Announce and dispatch.** Print one line like `/iflow -> /iflow-plan (issue #N: no plan file yet)` and then follow the chosen command's playbook. Forward the user's trailing text verbatim.
51
+
52
+ 4. **Respect downstream checkpoints.** Never suppress the downstream command's own prompts (plan confirmation, unrelated-changes prompt, etc.). `/iflow` adds no new confirmation layer of its own.
53
+
54
+ 5. **Report.** Summarize: focus issue `N` and how it was resolved, which command was dispatched and why, the downstream output, and a one-line hint when an off-path command is the natural next step:
55
+ - state **D** + PR likely merged → "after the PR merges, run `/iflow-cleanup`"
56
+ - mid-stream context switch needed → "to park this work, run `/iflow-pause`"
57
+ - tiny fix that would benefit from a single-shot chain → "consider `/iflow-yolo` next time"
58
+
59
+ ## Constraints
60
+
61
+ - Never auto-dispatch to `/iflow-pick`, `/iflow-pause`, `/iflow-cleanup`, `/iflow-yolo`, or `/iflow-fix`.
62
+ - If the focus issue cannot be resolved (multiple groups, branch ambiguous), stop and ask.
63
+ - Do not modify files beyond what the downstream command would normally modify. `/iflow` itself writes nothing — all file changes come from the dispatched command.
64
+ - Dispatch to at most one command per `/iflow` invocation.