engineering-process 0.1.0__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.
- engineering_process/__init__.py +3 -0
- engineering_process/_download_worker.py +73 -0
- engineering_process/_supervisor_posix.py +162 -0
- engineering_process/_supervisor_windows.py +148 -0
- engineering_process/_windows_job.py +419 -0
- engineering_process/bootstrap.py +217 -0
- engineering_process/bundles.py +81 -0
- engineering_process/cli.py +1012 -0
- engineering_process/contracts.py +1274 -0
- engineering_process/distribution.py +90 -0
- engineering_process/environment.py +753 -0
- engineering_process/helper_launch.py +37 -0
- engineering_process/lifecycle.py +1024 -0
- engineering_process/managed.py +89 -0
- engineering_process/markdown.py +78 -0
- engineering_process/publication.py +463 -0
- engineering_process/requirements-build.txt +1 -0
- engineering_process/requirements-dev.txt +10 -0
- engineering_process/requirements-runtime.txt +3 -0
- engineering_process/runner.py +191 -0
- engineering_process/runtime.py +55 -0
- engineering_process/skills.py +118 -0
- engineering_process/supervision.py +72 -0
- engineering_process/syncing.py +398 -0
- engineering_process/tooling.py +891 -0
- engineering_process-0.1.0.data/data/share/engineering-process/bundles.json +47 -0
- engineering_process-0.1.0.data/data/share/engineering-process/examples/change.json +26 -0
- engineering_process-0.1.0.data/data/share/engineering-process/examples/plan.json +28 -0
- engineering_process-0.1.0.data/data/share/engineering-process/examples/project.json +54 -0
- engineering_process-0.1.0.data/data/share/engineering-process/examples/review.json +31 -0
- engineering_process-0.1.0.data/data/share/engineering-process/schemas/change.schema.json +88 -0
- engineering_process-0.1.0.data/data/share/engineering-process/schemas/lifecycle.schema.json +122 -0
- engineering_process-0.1.0.data/data/share/engineering-process/schemas/plan.schema.json +105 -0
- engineering_process-0.1.0.data/data/share/engineering-process/schemas/process-lock.schema.json +39 -0
- engineering_process-0.1.0.data/data/share/engineering-process/schemas/project.schema.json +515 -0
- engineering_process-0.1.0.data/data/share/engineering-process/schemas/review.schema.json +140 -0
- engineering_process-0.1.0.data/data/share/engineering-process/schemas/reviewer-attestation.schema.json +30 -0
- engineering_process-0.1.0.data/data/share/engineering-process/schemas/verification.schema.json +120 -0
- engineering_process-0.1.0.data/data/share/engineering-process/skills/assess-design/SKILL.md +39 -0
- engineering_process-0.1.0.data/data/share/engineering-process/skills/build-frontend/SKILL.md +38 -0
- engineering_process-0.1.0.data/data/share/engineering-process/skills/build-frontend-foundation/SKILL.md +36 -0
- engineering_process-0.1.0.data/data/share/engineering-process/skills/change-api/SKILL.md +36 -0
- engineering_process-0.1.0.data/data/share/engineering-process/skills/cross-repo-change/SKILL.md +37 -0
- engineering_process-0.1.0.data/data/share/engineering-process/skills/define-change-contract/SKILL.md +40 -0
- engineering_process-0.1.0.data/data/share/engineering-process/skills/design-module/SKILL.md +37 -0
- engineering_process-0.1.0.data/data/share/engineering-process/skills/evolve-process/SKILL.md +37 -0
- engineering_process-0.1.0.data/data/share/engineering-process/skills/finish-change/SKILL.md +34 -0
- engineering_process-0.1.0.data/data/share/engineering-process/skills/govern-ui/SKILL.md +40 -0
- engineering_process-0.1.0.data/data/share/engineering-process/skills/implement-change/SKILL.md +41 -0
- engineering_process-0.1.0.data/data/share/engineering-process/skills/implement-module/SKILL.md +36 -0
- engineering_process-0.1.0.data/data/share/engineering-process/skills/implement-use-case/SKILL.md +36 -0
- engineering_process-0.1.0.data/data/share/engineering-process/skills/integrate-mcp/SKILL.md +37 -0
- engineering_process-0.1.0.data/data/share/engineering-process/skills/maintain-docs/SKILL.md +35 -0
- engineering_process-0.1.0.data/data/share/engineering-process/skills/plan-change/SKILL.md +37 -0
- engineering_process-0.1.0.data/data/share/engineering-process/skills/publish-change/SKILL.md +38 -0
- engineering_process-0.1.0.data/data/share/engineering-process/skills/review-change/SKILL.md +49 -0
- engineering_process-0.1.0.data/data/share/engineering-process/skills/run-change/SKILL.md +51 -0
- engineering_process-0.1.0.data/data/share/engineering-process/skills/run-change/references/execution.md +88 -0
- engineering_process-0.1.0.data/data/share/engineering-process/skills/run-project-command/SKILL.md +55 -0
- engineering_process-0.1.0.data/data/share/engineering-process/skills/specify-use-case/SKILL.md +37 -0
- engineering_process-0.1.0.data/data/share/engineering-process/skills/verify-change/SKILL.md +38 -0
- engineering_process-0.1.0.data/data/share/engineering-process/templates/AGENTS.process.md +17 -0
- engineering_process-0.1.0.data/data/share/engineering-process/templates/PULL_REQUEST_TEMPLATE.md +27 -0
- engineering_process-0.1.0.dist-info/METADATA +387 -0
- engineering_process-0.1.0.dist-info/RECORD +69 -0
- engineering_process-0.1.0.dist-info/WHEEL +5 -0
- engineering_process-0.1.0.dist-info/entry_points.txt +2 -0
- engineering_process-0.1.0.dist-info/licenses/LICENSE +21 -0
- engineering_process-0.1.0.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import hashlib
|
|
4
|
+
from pathlib import Path
|
|
5
|
+
|
|
6
|
+
from .contracts import ContractError
|
|
7
|
+
from .skills import MARKER_NAME, validate_skills
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
def asset_root(process_root: Path) -> Path:
|
|
11
|
+
candidates = (
|
|
12
|
+
process_root,
|
|
13
|
+
process_root / "share" / "engineering-process",
|
|
14
|
+
)
|
|
15
|
+
for candidate in candidates:
|
|
16
|
+
if (candidate / "bundles.json").is_file() and (candidate / "skills").is_dir():
|
|
17
|
+
return candidate
|
|
18
|
+
if (candidate / "bundles.json").is_file() and (candidate / ".agents" / "skills").is_dir():
|
|
19
|
+
return candidate
|
|
20
|
+
raise ContractError(f"{process_root}: cannot locate engineering-process assets")
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
def skills_root(process_root: Path) -> Path:
|
|
24
|
+
root = asset_root(process_root)
|
|
25
|
+
candidates = (root / ".agents" / "skills", root / "skills")
|
|
26
|
+
for candidate in candidates:
|
|
27
|
+
if candidate.is_dir():
|
|
28
|
+
return candidate
|
|
29
|
+
raise ContractError(f"{process_root}: cannot locate engineering-process skills")
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
def _files(root: Path) -> list[Path]:
|
|
33
|
+
return sorted(
|
|
34
|
+
path
|
|
35
|
+
for path in root.rglob("*")
|
|
36
|
+
if path.is_file()
|
|
37
|
+
and path.name != MARKER_NAME
|
|
38
|
+
and "__pycache__" not in path.parts
|
|
39
|
+
)
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
def distribution_digest(
|
|
43
|
+
process_root: Path,
|
|
44
|
+
selected_skills: tuple[str, ...],
|
|
45
|
+
*,
|
|
46
|
+
package_root: Path | None = None,
|
|
47
|
+
) -> str:
|
|
48
|
+
root = asset_root(process_root)
|
|
49
|
+
skill_root = skills_root(process_root)
|
|
50
|
+
issues = validate_skills(skill_root, selected_skills)
|
|
51
|
+
if issues:
|
|
52
|
+
raise ContractError("\n".join(issues))
|
|
53
|
+
|
|
54
|
+
runtime_root = (
|
|
55
|
+
Path(__file__).resolve().parent
|
|
56
|
+
if package_root is None
|
|
57
|
+
else package_root.resolve()
|
|
58
|
+
)
|
|
59
|
+
entries: list[tuple[str, Path]] = []
|
|
60
|
+
for path in _files(runtime_root):
|
|
61
|
+
if path.suffix in {".py", ".txt"}:
|
|
62
|
+
entries.append(
|
|
63
|
+
(
|
|
64
|
+
f"runtime/engineering_process/{path.relative_to(runtime_root).as_posix()}",
|
|
65
|
+
path,
|
|
66
|
+
)
|
|
67
|
+
)
|
|
68
|
+
|
|
69
|
+
entries.append(("assets/bundles.json", root / "bundles.json"))
|
|
70
|
+
for directory in ("schemas", "examples", "templates"):
|
|
71
|
+
candidate = root / directory
|
|
72
|
+
if candidate.is_dir():
|
|
73
|
+
entries.extend(
|
|
74
|
+
(f"assets/{path.relative_to(root).as_posix()}", path)
|
|
75
|
+
for path in _files(candidate)
|
|
76
|
+
)
|
|
77
|
+
for skill in selected_skills:
|
|
78
|
+
directory = skill_root / skill
|
|
79
|
+
entries.extend(
|
|
80
|
+
(f"assets/skills/{skill}/{path.relative_to(directory).as_posix()}", path)
|
|
81
|
+
for path in _files(directory)
|
|
82
|
+
)
|
|
83
|
+
|
|
84
|
+
digest = hashlib.sha256()
|
|
85
|
+
for logical_path, path in sorted(entries):
|
|
86
|
+
digest.update(logical_path.encode("utf-8"))
|
|
87
|
+
digest.update(b"\0")
|
|
88
|
+
digest.update(path.read_bytes())
|
|
89
|
+
digest.update(b"\0")
|
|
90
|
+
return f"sha256:{digest.hexdigest()}"
|