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,81 @@
1
+ from __future__ import annotations
2
+
3
+ from pathlib import Path
4
+
5
+ from .contracts import ContractError, SKILL_PATTERN, read_json
6
+ from .skills import skill_directories
7
+
8
+
9
+ MANDATORY_BUNDLE = "core"
10
+
11
+
12
+ def bundles_path(process_root: Path) -> Path:
13
+ candidates = (
14
+ process_root / "bundles.json",
15
+ process_root / "share" / "engineering-process" / "bundles.json",
16
+ )
17
+ for candidate in candidates:
18
+ if candidate.is_file():
19
+ return candidate
20
+ raise ContractError(f"{process_root}: cannot locate bundles.json")
21
+
22
+
23
+ def load_bundles(process_root: Path, skills_root: Path) -> dict[str, tuple[str, ...]]:
24
+ path = bundles_path(process_root)
25
+ document = read_json(path)
26
+ if (
27
+ not isinstance(document, dict)
28
+ or set(document) != {"schemaVersion", "bundles"}
29
+ or document.get("schemaVersion") != 1
30
+ or not isinstance(document.get("bundles"), dict)
31
+ or not document["bundles"]
32
+ ):
33
+ raise ContractError(f"{path}: invalid bundle contract")
34
+
35
+ available = {directory.name for directory in skill_directories(skills_root)}
36
+ result: dict[str, tuple[str, ...]] = {}
37
+ owned: dict[str, str] = {}
38
+ for name, raw_skills in document["bundles"].items():
39
+ if SKILL_PATTERN.fullmatch(name) is None:
40
+ raise ContractError(f"{path}: invalid bundle name {name}")
41
+ if (
42
+ not isinstance(raw_skills, list)
43
+ or not raw_skills
44
+ or not all(
45
+ isinstance(skill, str) and SKILL_PATTERN.fullmatch(skill)
46
+ for skill in raw_skills
47
+ )
48
+ or raw_skills != sorted(set(raw_skills))
49
+ ):
50
+ raise ContractError(f"{path}: bundle {name} must be a sorted unique skill list")
51
+ missing = sorted(set(raw_skills) - available)
52
+ if missing:
53
+ raise ContractError(
54
+ f"{path}: bundle {name} references missing skills: {', '.join(missing)}"
55
+ )
56
+ for skill in raw_skills:
57
+ previous = owned.get(skill)
58
+ if previous is not None:
59
+ raise ContractError(
60
+ f"{path}: skill {skill} belongs to both {previous} and {name}"
61
+ )
62
+ owned[skill] = name
63
+ result[name] = tuple(raw_skills)
64
+ unowned = sorted(available - set(owned))
65
+ if unowned:
66
+ raise ContractError(
67
+ f"{path}: skills missing bundle ownership: {', '.join(unowned)}"
68
+ )
69
+ return result
70
+
71
+
72
+ def select_bundles(
73
+ available: dict[str, tuple[str, ...]], requested: list[str] | None
74
+ ) -> tuple[str, ...]:
75
+ if MANDATORY_BUNDLE not in available:
76
+ raise ContractError("bundle catalog is missing the mandatory core bundle")
77
+ selected = {MANDATORY_BUNDLE, *(requested or [])}
78
+ unknown = sorted(selected - set(available))
79
+ if unknown:
80
+ raise ContractError(f"unknown bundles: {', '.join(unknown)}")
81
+ return tuple(sorted(selected))