icdev-core 0.2.1__py3-none-any.whl

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.
@@ -0,0 +1,136 @@
1
+ Metadata-Version: 2.4
2
+ Name: icdev-core
3
+ Version: 0.2.1
4
+ Summary: ICDEV shared core: domain declaration, path resolution, identity assertion and sensitivity labelling for the ICDEV[IT] and ICDEV[FT] parents.
5
+ Author: Sovanna Chuon
6
+ License-Expression: Apache-2.0
7
+ Project-URL: Homepage, https://github.com/icdev-ai/icdev-core
8
+ Keywords: icdev,domain,paths,identity,sensitivity
9
+ Classifier: Development Status :: 4 - Beta
10
+ Classifier: Intended Audience :: Developers
11
+ Classifier: Operating System :: OS Independent
12
+ Classifier: Programming Language :: Python :: 3
13
+ Classifier: Programming Language :: Python :: 3.9
14
+ Requires-Python: >=3.9
15
+ Description-Content-Type: text/markdown
16
+ Requires-Dist: PyYAML>=6.0
17
+ Requires-Dist: python-dotenv>=1.0
18
+
19
+ # icdev-core
20
+
21
+ The shared core of the ICDEV domain split: the small set of modules **both** parents need,
22
+ carved out of [`icdev-ai/icdev`](https://github.com/icdev-ai/icdev) with history preserved.
23
+
24
+ Distribution name is `icdev-core`; the **import root stays `icdev.core`**, unchanged.
25
+
26
+ ## What is in here, and why only this
27
+
28
+ | module | answers |
29
+ |---|---|
30
+ | `paths` | *where is the repo root?* The ONE resolver. |
31
+ | `domain` | *which parent is this checkout?* Reads `icdev_domain.yaml`. |
32
+ | `context` | *may this process touch this database?* `assert_identity` / `check_identity` / `load_env`. |
33
+ | `sensitivity` | *how sensitive is this table?* The one classification ladder. |
34
+ | `schema/tables.yaml` | the core-owned table manifest. |
35
+
36
+ The boundary was chosen from measurement, not from prose (`xcore-dec-01`). Two facts decided it:
37
+
38
+ - **`icdev/core` has zero dependency on `tools/`.** It imports stdlib, plus `yaml` and
39
+ `dotenv` *locally inside the functions that need them* so importing the module pulls in no
40
+ third-party code. That is what made it separable at all.
41
+ - **ICDEV[FT] already imports `icdev.core` in 32 files** and obtains it by putting the IT
42
+ checkout on `sys.path`. Replacing that `sys.path` coupling with a real dependency is the
43
+ whole point of this repo.
44
+
45
+ Public API, derived from what the parents actually call rather than what was declared:
46
+
47
+ ```
48
+ context.assert_identity 19 paths.repo_root 13
49
+ context.load_env 3 domain.{Domain, DomainError, load_domain} 1
50
+ context.check_identity 1 sensitivity (IT row_security)
51
+ ```
52
+
53
+ ## `icdev` is a namespace package, and that is load-bearing
54
+
55
+ This distribution ships `icdev/core/` and **no `icdev/__init__.py`**, so `icdev` is a PEP 420
56
+ namespace package.
57
+
58
+ Both this distribution and the ICDEV[IT] parent install into the same `icdev` name. A regular
59
+ package has ONE `__path__`, so whichever were found first would win and the other's subpackages
60
+ would silently vanish -- `icdev.core` unimportable in one direction, `icdev.tools` in the other.
61
+ That is exactly what was measured before the fix: with the parent installed editable, `icdev`
62
+ resolved to `C:/AI/ICDev/icdev` and installing this package beside it changed nothing at all.
63
+
64
+ `pkgutil.extend_path` in **both** distributions was tried first and rejected. It merges
65
+ `__path__` correctly, but only ONE `icdev/__init__.py` ever *executes* -- and when this one won,
66
+ the parent's `_alias_tools_namespace()` never ran: the function that makes ~1,900
67
+ `from tools.X import ...` imports resolve inside the parent's published wheel. An
68
+ order-dependent silent break of every installed deployment is worse than the shadowing it was
69
+ meant to fix.
70
+
71
+ Shipping none here makes the parent's the only `__init__.py`, so it runs whatever the path
72
+ order, and `extend_path` on the parent's side pulls `icdev/core/` in beside `icdev/tools/`.
73
+
74
+ Pinned by `tests/test_namespace_package.py` and by a CI step that inspects the built wheel --
75
+ because if setuptools' `namespaces` discovery ever defaults off, this repo publishes a wheel
76
+ with no `icdev.core` in it and nothing here notices; the ImportError surfaces in a parent.
77
+
78
+ ## What is deliberately NOT in here
79
+
80
+ **`shim.py` stayed in the IT parent.** It exists solely to make `tools.X` and
81
+ `icdev.tools.X` resolve to one module object in IT's dual tree — and the FT parent has no
82
+ `tools/` directory at all. Shipping it here would put one parent's layout knowledge inside
83
+ the package both parents install.
84
+
85
+ **The "functional core"** — storage, kanban, llm, genesis — stays in the IT parent. The
86
+ carve-out cards used "core" for both that and this package; they are different by three
87
+ orders of magnitude (3,690 files against 6), and only this one is separable today.
88
+
89
+ ## Why this repo is public
90
+
91
+ Every module here was **already public** in `icdev-ai/icdev`, so publishing them separately
92
+ exposes nothing new. A private core would be strictly worse: the *public* parent depends on
93
+ it, so installing it in public CI would require a deploy token — a genuinely new secret in a
94
+ public workflow, traded for hiding files that are already visible.
95
+
96
+ ## Using it
97
+
98
+ ```bash
99
+ pip install -e ../icdev-core # development, from a sibling checkout
100
+ ```
101
+
102
+ ```bash
103
+ pip install icdev-core # from PyPI (0.2.1+); `pip install icdev` pulls it in
104
+ ```
105
+
106
+ Releases are semver tags. Publishing a GitHub release runs `.github/workflows/pypi-publish.yml`,
107
+ which uploads to PyPI via Trusted Publishing; the tag must equal `v<pyproject version>`.
108
+ For air-gapped installs, mirror the wheel to a local wheelhouse and use
109
+ `pip install --no-index --find-links`. Pure Python, no build step.
110
+
111
+ ## Acceptance — what this package can and cannot prove
112
+
113
+ The original criterion here read *"proven when ICDEV[FT] drops its `sys.path.insert` of the IT
114
+ checkout and installs this package instead."* **That is not reachable, and stating it made a
115
+ finished carve-out look permanently incomplete.** Measured on ICDEV[FT] 2026-08-27:
116
+
117
+ | ICDEV[FT] modules importing | count | supplied by |
118
+ |---|---|---|
119
+ | `icdev.core.*` | 32 | **this package** |
120
+ | `tools.*` | 72 | only the ICDEV[IT] checkout |
121
+
122
+ `tools` exists because ICDEV[IT]'s `icdev/__init__.py` binds it to `icdev.tools`. This package
123
+ ships `icdev/core/` and deliberately nothing else, so it cannot supply it and installing it
124
+ cannot remove that checkout.
125
+
126
+ **What IS achieved, and is verified:**
127
+
128
+ - ICDEV[IT] no longer ships `icdev/core` and depends on this distribution (`xcore-cut-02`).
129
+ - Both parents pin a tag, never a branch, and a parent's own gate fails if it calls a symbol the
130
+ pinned core does not export (`coherence_checker --check core_api`).
131
+ - A change here is proven against ICDEV[IT] **before** merge by `core-compat.yml`, and against
132
+ ICDEV[FT] daily by the matching workflow in that repository (`xcore-compat-01`).
133
+
134
+ **What is still outstanding:** ICDEV[FT]'s 72 `tools.*` imports. Removing that coupling is its
135
+ own piece of work — a second extraction, or repointing those callers — and is not a side effect
136
+ of this package existing.
@@ -0,0 +1,10 @@
1
+ icdev/core/__init__.py,sha256=xM9AS8Q7b5Y8p1m-l3WldW6g7lZXx2J56hnp1zFiRdM,1017
2
+ icdev/core/context.py,sha256=6i3jtqYeV9hzuAM8LrkXlvEemOER2S1dqJlc8UYrlaE,7577
3
+ icdev/core/domain.py,sha256=AulAVAFIA8MdFz4TXqjOwaKZ8PE3Uuv8a5ztAdKsESo,10625
4
+ icdev/core/paths.py,sha256=Hl_1oEhiriMlH10Nxioa-9jt8Ysgg0k7Ol3lKQICG0o,7189
5
+ icdev/core/sensitivity.py,sha256=PB2onEjTLhocXm6xn63u9WEpBKz8i6Sucfefn6sUaw0,6141
6
+ icdev/core/schema/tables.yaml,sha256=phkM9vz2QOn4ryUVgufLuQ1Umae5_T6GhugReFvNr4Y,14154
7
+ icdev_core-0.2.1.dist-info/METADATA,sha256=WZpvzxHhK2oiw9I7pFq5276uY6LuIolOcBxBKNy7itg,6812
8
+ icdev_core-0.2.1.dist-info/WHEEL,sha256=YVMoNqKzERt-wjUZwJ33xBGAwnFl-4cqbYkTtWa4itE,91
9
+ icdev_core-0.2.1.dist-info/top_level.txt,sha256=bXMrM8d1u0hq5jOtmHAHsM6x1xOFnAire2EYqjgahuk,6
10
+ icdev_core-0.2.1.dist-info/RECORD,,
@@ -0,0 +1,5 @@
1
+ Wheel-Version: 1.0
2
+ Generator: setuptools (84.0.0)
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
5
+
@@ -0,0 +1 @@
1
+ icdev