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.
Files changed (69) hide show
  1. engineering_process/__init__.py +3 -0
  2. engineering_process/_download_worker.py +73 -0
  3. engineering_process/_supervisor_posix.py +162 -0
  4. engineering_process/_supervisor_windows.py +148 -0
  5. engineering_process/_windows_job.py +419 -0
  6. engineering_process/bootstrap.py +217 -0
  7. engineering_process/bundles.py +81 -0
  8. engineering_process/cli.py +1012 -0
  9. engineering_process/contracts.py +1274 -0
  10. engineering_process/distribution.py +90 -0
  11. engineering_process/environment.py +753 -0
  12. engineering_process/helper_launch.py +37 -0
  13. engineering_process/lifecycle.py +1024 -0
  14. engineering_process/managed.py +89 -0
  15. engineering_process/markdown.py +78 -0
  16. engineering_process/publication.py +463 -0
  17. engineering_process/requirements-build.txt +1 -0
  18. engineering_process/requirements-dev.txt +10 -0
  19. engineering_process/requirements-runtime.txt +3 -0
  20. engineering_process/runner.py +191 -0
  21. engineering_process/runtime.py +55 -0
  22. engineering_process/skills.py +118 -0
  23. engineering_process/supervision.py +72 -0
  24. engineering_process/syncing.py +398 -0
  25. engineering_process/tooling.py +891 -0
  26. engineering_process-0.1.0.data/data/share/engineering-process/bundles.json +47 -0
  27. engineering_process-0.1.0.data/data/share/engineering-process/examples/change.json +26 -0
  28. engineering_process-0.1.0.data/data/share/engineering-process/examples/plan.json +28 -0
  29. engineering_process-0.1.0.data/data/share/engineering-process/examples/project.json +54 -0
  30. engineering_process-0.1.0.data/data/share/engineering-process/examples/review.json +31 -0
  31. engineering_process-0.1.0.data/data/share/engineering-process/schemas/change.schema.json +88 -0
  32. engineering_process-0.1.0.data/data/share/engineering-process/schemas/lifecycle.schema.json +122 -0
  33. engineering_process-0.1.0.data/data/share/engineering-process/schemas/plan.schema.json +105 -0
  34. engineering_process-0.1.0.data/data/share/engineering-process/schemas/process-lock.schema.json +39 -0
  35. engineering_process-0.1.0.data/data/share/engineering-process/schemas/project.schema.json +515 -0
  36. engineering_process-0.1.0.data/data/share/engineering-process/schemas/review.schema.json +140 -0
  37. engineering_process-0.1.0.data/data/share/engineering-process/schemas/reviewer-attestation.schema.json +30 -0
  38. engineering_process-0.1.0.data/data/share/engineering-process/schemas/verification.schema.json +120 -0
  39. engineering_process-0.1.0.data/data/share/engineering-process/skills/assess-design/SKILL.md +39 -0
  40. engineering_process-0.1.0.data/data/share/engineering-process/skills/build-frontend/SKILL.md +38 -0
  41. engineering_process-0.1.0.data/data/share/engineering-process/skills/build-frontend-foundation/SKILL.md +36 -0
  42. engineering_process-0.1.0.data/data/share/engineering-process/skills/change-api/SKILL.md +36 -0
  43. engineering_process-0.1.0.data/data/share/engineering-process/skills/cross-repo-change/SKILL.md +37 -0
  44. engineering_process-0.1.0.data/data/share/engineering-process/skills/define-change-contract/SKILL.md +40 -0
  45. engineering_process-0.1.0.data/data/share/engineering-process/skills/design-module/SKILL.md +37 -0
  46. engineering_process-0.1.0.data/data/share/engineering-process/skills/evolve-process/SKILL.md +37 -0
  47. engineering_process-0.1.0.data/data/share/engineering-process/skills/finish-change/SKILL.md +34 -0
  48. engineering_process-0.1.0.data/data/share/engineering-process/skills/govern-ui/SKILL.md +40 -0
  49. engineering_process-0.1.0.data/data/share/engineering-process/skills/implement-change/SKILL.md +41 -0
  50. engineering_process-0.1.0.data/data/share/engineering-process/skills/implement-module/SKILL.md +36 -0
  51. engineering_process-0.1.0.data/data/share/engineering-process/skills/implement-use-case/SKILL.md +36 -0
  52. engineering_process-0.1.0.data/data/share/engineering-process/skills/integrate-mcp/SKILL.md +37 -0
  53. engineering_process-0.1.0.data/data/share/engineering-process/skills/maintain-docs/SKILL.md +35 -0
  54. engineering_process-0.1.0.data/data/share/engineering-process/skills/plan-change/SKILL.md +37 -0
  55. engineering_process-0.1.0.data/data/share/engineering-process/skills/publish-change/SKILL.md +38 -0
  56. engineering_process-0.1.0.data/data/share/engineering-process/skills/review-change/SKILL.md +49 -0
  57. engineering_process-0.1.0.data/data/share/engineering-process/skills/run-change/SKILL.md +51 -0
  58. engineering_process-0.1.0.data/data/share/engineering-process/skills/run-change/references/execution.md +88 -0
  59. engineering_process-0.1.0.data/data/share/engineering-process/skills/run-project-command/SKILL.md +55 -0
  60. engineering_process-0.1.0.data/data/share/engineering-process/skills/specify-use-case/SKILL.md +37 -0
  61. engineering_process-0.1.0.data/data/share/engineering-process/skills/verify-change/SKILL.md +38 -0
  62. engineering_process-0.1.0.data/data/share/engineering-process/templates/AGENTS.process.md +17 -0
  63. engineering_process-0.1.0.data/data/share/engineering-process/templates/PULL_REQUEST_TEMPLATE.md +27 -0
  64. engineering_process-0.1.0.dist-info/METADATA +387 -0
  65. engineering_process-0.1.0.dist-info/RECORD +69 -0
  66. engineering_process-0.1.0.dist-info/WHEEL +5 -0
  67. engineering_process-0.1.0.dist-info/entry_points.txt +2 -0
  68. engineering_process-0.1.0.dist-info/licenses/LICENSE +21 -0
  69. 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()}"