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.
- icdev/core/__init__.py +22 -0
- icdev/core/context.py +205 -0
- icdev/core/domain.py +265 -0
- icdev/core/paths.py +179 -0
- icdev/core/schema/tables.yaml +521 -0
- icdev/core/sensitivity.py +148 -0
- icdev_core-0.2.1.dist-info/METADATA +136 -0
- icdev_core-0.2.1.dist-info/RECORD +10 -0
- icdev_core-0.2.1.dist-info/WHEEL +5 -0
- icdev_core-0.2.1.dist-info/top_level.txt +1 -0
|
@@ -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 @@
|
|
|
1
|
+
icdev
|