@mamdouh-aboammar/agentic-workflow 1.2.0

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 (118) hide show
  1. package/.claude-plugin/plugin.json +10 -0
  2. package/.codex-plugin/plugin.json +13 -0
  3. package/.skills.json +19 -0
  4. package/AGENTS.md +1344 -0
  5. package/CLAUDE.md +178 -0
  6. package/GEMINI.md +102 -0
  7. package/LICENSE +21 -0
  8. package/README.md +350 -0
  9. package/SKILL.md +132 -0
  10. package/bin/agentic-hooks.sh +79 -0
  11. package/bin/cli.js +1060 -0
  12. package/core/__init__.py +52 -0
  13. package/core/ai_evaluator.py +117 -0
  14. package/core/autopilot_engine.py +368 -0
  15. package/core/clean_code_guard.py +188 -0
  16. package/core/engine_py/__init__.py +29 -0
  17. package/core/engine_py/agent_worker.py +136 -0
  18. package/core/engine_py/decider.py +150 -0
  19. package/core/engine_py/energy.py +45 -0
  20. package/core/engine_py/event_bus.py +63 -0
  21. package/core/engine_py/executor.py +186 -0
  22. package/core/engine_py/models.py +193 -0
  23. package/core/engine_py/queue.py +314 -0
  24. package/core/engine_py/runner.py +116 -0
  25. package/core/engine_py/system_workers.py +70 -0
  26. package/core/engine_py/toon_adapter.py +586 -0
  27. package/core/engine_py/verification_controller.py +208 -0
  28. package/core/engine_py/worker.py +167 -0
  29. package/core/engine_spec/event_schema.json +65 -0
  30. package/core/engine_spec/example_workflow.yaml +73 -0
  31. package/core/engine_spec/workflow_schema.json +127 -0
  32. package/core/hooks/__init__.py +29 -0
  33. package/core/hooks/adapters/__init__.py +25 -0
  34. package/core/hooks/adapters/claude_adapter.py +83 -0
  35. package/core/hooks/adapters/cli_agent_adapter.py +82 -0
  36. package/core/hooks/adapters/codex_adapter.py +78 -0
  37. package/core/hooks/adapters/cursor_adapter.py +73 -0
  38. package/core/hooks/adapters/gemini_adapter.py +93 -0
  39. package/core/hooks/adapters/homebrew_adapter.py +69 -0
  40. package/core/hooks/adapters/mcp_proxy.py +133 -0
  41. package/core/hooks/adapters/shell_adapter.py +65 -0
  42. package/core/hooks/dispatcher.py +118 -0
  43. package/core/hooks/policy_engine.py +375 -0
  44. package/core/hooks/session_end.py +141 -0
  45. package/core/hooks/types.py +147 -0
  46. package/core/integrations/__init__.py +28 -0
  47. package/core/integrations/installer.py +225 -0
  48. package/core/integrations/lifecycle_director.py +175 -0
  49. package/core/integrations/registry.py +105 -0
  50. package/core/multi_agent_system.py +164 -0
  51. package/core/skills_indexer.py +742 -0
  52. package/core/system/__init__.py +25 -0
  53. package/core/system/announcements.py +72 -0
  54. package/core/system/dependencies.py +69 -0
  55. package/core/system/doctor.py +171 -0
  56. package/core/system/health.py +144 -0
  57. package/core/system/installer.py +137 -0
  58. package/core/system/notifications.py +97 -0
  59. package/core/system/refresher.py +110 -0
  60. package/core/system/updater.py +167 -0
  61. package/core/system/version_tracker.py +65 -0
  62. package/docs/architecture_plan.md +7 -0
  63. package/docs/guides/failure-recovery.md +714 -0
  64. package/docs/implementation_summary.md +10 -0
  65. package/docs/protocols/autopilot-execution.md +148 -0
  66. package/docs/protocols/code-change-protocol.md +49 -0
  67. package/docs/protocols/context-preservation-detail.md +114 -0
  68. package/docs/protocols/quality-gates.md +110 -0
  69. package/docs/protocols/ulw-mode.md +60 -0
  70. package/docs/research_findings.md +10 -0
  71. package/docs/solutions/autonomous-autopilot-engine-architecture.md +38 -0
  72. package/install.sh +111 -0
  73. package/marketplace.json +37 -0
  74. package/package.json +81 -0
  75. package/skills/agentic-workflow/SKILL.md +132 -0
  76. package/skills/agentic-workflow/skill-spec.json +100 -0
  77. package/soul.md +445 -0
  78. package/src/engine_ts/decider.ts +186 -0
  79. package/src/engine_ts/event-bus.ts +57 -0
  80. package/src/engine_ts/executor.ts +262 -0
  81. package/src/engine_ts/index.ts +12 -0
  82. package/src/engine_ts/queue.ts +93 -0
  83. package/src/engine_ts/runner.ts +108 -0
  84. package/src/engine_ts/skills-indexer.ts +264 -0
  85. package/src/engine_ts/toon-adapter.ts +91 -0
  86. package/src/engine_ts/types.ts +134 -0
  87. package/src/engine_ts/verification-controller.ts +204 -0
  88. package/src/engine_ts/worker.ts +280 -0
  89. package/src/hooks/adapters/claude-adapter.ts +54 -0
  90. package/src/hooks/adapters/cli-agent-adapter.ts +46 -0
  91. package/src/hooks/adapters/codex-adapter.ts +69 -0
  92. package/src/hooks/adapters/cursor-adapter.ts +60 -0
  93. package/src/hooks/adapters/gemini-adapter.ts +71 -0
  94. package/src/hooks/adapters/homebrew-adapter.ts +36 -0
  95. package/src/hooks/adapters/mcp-proxy.ts +66 -0
  96. package/src/hooks/adapters/shell-adapter.ts +42 -0
  97. package/src/hooks/dispatcher.ts +113 -0
  98. package/src/hooks/index.ts +16 -0
  99. package/src/hooks/policy-engine.ts +376 -0
  100. package/src/hooks/session-end.ts +125 -0
  101. package/src/hooks/types.ts +61 -0
  102. package/src/index.d.ts +34 -0
  103. package/src/index.ts +23 -0
  104. package/src/integrations/index.ts +7 -0
  105. package/src/integrations/installer.ts +208 -0
  106. package/src/integrations/lifecycle-director.ts +139 -0
  107. package/src/integrations/registry.ts +82 -0
  108. package/src/system/announcements.ts +143 -0
  109. package/src/system/dependencies.ts +176 -0
  110. package/src/system/doctor.ts +374 -0
  111. package/src/system/health.ts +270 -0
  112. package/src/system/index.ts +14 -0
  113. package/src/system/installer.ts +262 -0
  114. package/src/system/notifications.ts +180 -0
  115. package/src/system/refresher.ts +207 -0
  116. package/src/system/types.ts +268 -0
  117. package/src/system/updater.ts +219 -0
  118. package/src/system/version-tracker.ts +137 -0
@@ -0,0 +1,116 @@
1
+ #!/usr/bin/env python3
2
+ """
3
+ runner.py — CLI entry point for Python Agentic Engine.
4
+ """
5
+
6
+ import os
7
+ import sys
8
+ import asyncio
9
+
10
+ # Ensure project root is on sys.path
11
+ root_dir = os.path.abspath(os.path.join(os.path.dirname(__file__), "../.."))
12
+ if root_dir not in sys.path:
13
+ sys.path.insert(0, root_dir)
14
+
15
+ from core.engine_py.models import (
16
+ WorkflowDefinition, StageDefinition, TaskDefinition, AgentRole
17
+ )
18
+ from core.engine_py.queue import InMemoryTaskQueue
19
+ from core.engine_py.event_bus import AsyncEventBus
20
+ from core.engine_py.verification_controller import VerificationController
21
+ from core.engine_py.system_workers import SystemWorker
22
+ from core.engine_py.agent_worker import AgentWorker
23
+ from core.engine_py.executor import AgenticExecutor
24
+
25
+
26
+ async def main():
27
+ project_dir = os.getcwd()
28
+ print("šŸš€ [engine-py] Starting Event-Driven Agentic Engine (Python AsyncIO)...")
29
+
30
+ wf_def = WorkflowDefinition(
31
+ name="autonomous_agentic_pipeline",
32
+ version="1.0.0",
33
+ stages=[
34
+ StageDefinition(
35
+ id="stage_01_research",
36
+ name="Stage 1: Research",
37
+ tasks=[
38
+ TaskDefinition(
39
+ id="task_research_01",
40
+ name="Analyze System Architecture and Dependencies",
41
+ type="agent.task",
42
+ role=AgentRole.RESEARCHER,
43
+ deliverable_path="docs/research_findings.md",
44
+ criteria=["Analyze architecture patterns", "Establish baseline"]
45
+ )
46
+ ]
47
+ ),
48
+ StageDefinition(
49
+ id="stage_02_planning",
50
+ name="Stage 2: Planning",
51
+ tasks=[
52
+ TaskDefinition(
53
+ id="task_plan_approval",
54
+ name="Autopilot Plan Approval",
55
+ type="agent.human",
56
+ role=AgentRole.ORCHESTRATOR
57
+ )
58
+ ]
59
+ ),
60
+ StageDefinition(
61
+ id="stage_03_implementation",
62
+ name="Stage 3: Implementation",
63
+ tasks=[
64
+ TaskDefinition(
65
+ id="task_code_impl",
66
+ name="Implement Core Production Logic",
67
+ type="agent.task",
68
+ role=AgentRole.ENGINEER,
69
+ deliverable_path="docs/implementation_summary.md",
70
+ criteria=["Pass unit tests", "Generate comprehensive documentation"]
71
+ ),
72
+ TaskDefinition(
73
+ id="task_review_01",
74
+ name="Adversarial Code & Fact-Check Review",
75
+ type="agent.review",
76
+ role=AgentRole.REVIEWER,
77
+ deliverable_path="review-logs/step-3-review.md",
78
+ criteria=["Zero critical vulnerabilities"]
79
+ )
80
+ ]
81
+ )
82
+ ]
83
+ )
84
+
85
+ queue = InMemoryTaskQueue()
86
+ ledger_path = os.path.join(project_dir, "ledger.jsonl")
87
+ event_bus = AsyncEventBus(ledger_path=ledger_path)
88
+ verifier = VerificationController(project_dir=project_dir)
89
+
90
+ sys_worker = SystemWorker(worker_id="sys_worker_py", queue=queue, event_bus=event_bus, verification_controller=verifier)
91
+ agent_worker = AgentWorker(worker_id="agent_worker_py", queue=queue, event_bus=event_bus, verification_controller=verifier, project_dir=project_dir)
92
+
93
+ executor = AgenticExecutor(
94
+ workflow_def=wf_def,
95
+ queue=queue,
96
+ event_bus=event_bus,
97
+ project_dir=project_dir,
98
+ sot_filename="state.yaml"
99
+ )
100
+
101
+ print(f"⚔ Trace ID: {executor.instance.trace_id}")
102
+ print(f"⚔ Workflow ID: {executor.instance.workflow_id}")
103
+ print(f"⚔ SOT Path: {executor.sot_path}")
104
+
105
+ success = await executor.run_until_complete(workers=[sys_worker, agent_worker], poll_interval=0.02, max_iterations=50)
106
+
107
+ if success:
108
+ print("\nšŸŽ‰ [engine-py] Workflow Completed Successfully with All Gates Verified!")
109
+ sys.exit(0)
110
+ else:
111
+ print("\nāŒ [engine-py] Workflow execution halted or failed gates.")
112
+ sys.exit(1)
113
+
114
+
115
+ if __name__ == "__main__":
116
+ asyncio.run(main())
@@ -0,0 +1,70 @@
1
+ """
2
+ system_workers.py — Built-in System Task Workers.
3
+
4
+ Implements handlers for:
5
+ - system.code: executes inline Python or shell code
6
+ - system.wait: timer delays or external signal pauses
7
+ - system.switch: evaluates dynamic conditional branching
8
+ - system.transform: data projection and key transformation
9
+ """
10
+
11
+ import os
12
+ import sys
13
+ import asyncio
14
+ from typing import Dict, Any, List
15
+
16
+ from core.engine_py.models import TaskInstance
17
+ from core.engine_py.worker import BaseWorker
18
+
19
+
20
+ class SystemWorker(BaseWorker):
21
+ """Worker handling core system task execution without external AI dependencies."""
22
+
23
+ def __init__(self, worker_id: str, queue, event_bus, verification_controller=None):
24
+ super().__init__(
25
+ worker_id=worker_id,
26
+ task_types=["system.code", "system.wait", "system.switch", "system.transform"],
27
+ queue=queue,
28
+ event_bus=event_bus,
29
+ verification_controller=verification_controller
30
+ )
31
+
32
+ async def execute_task(self, task: TaskInstance) -> Dict[str, Any]:
33
+ task_type = task.task_def.type
34
+
35
+ if task_type == "system.code":
36
+ return await self._execute_code(task)
37
+ elif task_type == "system.wait":
38
+ return await self._execute_wait(task)
39
+ elif task_type == "system.switch":
40
+ return await self._execute_switch(task)
41
+ elif task_type == "system.transform":
42
+ return await self._execute_transform(task)
43
+ else:
44
+ raise ValueError(f"Unsupported system task type: {task_type}")
45
+
46
+ async def _execute_code(self, task: TaskInstance) -> Dict[str, Any]:
47
+ code = task.task_def.input_parameters.get("code", "")
48
+ # Safe evaluation of deterministic expressions
49
+ local_scope: Dict[str, Any] = {"inputs": task.input_data, "result": None}
50
+ exec(code, {}, local_scope)
51
+ return {"result": local_scope.get("result", "COMPLETED")}
52
+
53
+ async def _execute_wait(self, task: TaskInstance) -> Dict[str, Any]:
54
+ duration = float(task.task_def.input_parameters.get("seconds", 1.0))
55
+ await asyncio.sleep(min(duration, 10.0)) # Capped for safety in test run
56
+ return {"waited_seconds": duration}
57
+
58
+ async def _execute_switch(self, task: TaskInstance) -> Dict[str, Any]:
59
+ condition_key = task.task_def.input_parameters.get("key", "status")
60
+ val = task.input_data.get(condition_key)
61
+ branches = task.task_def.branches
62
+ chosen_branch = branches.get(str(val), branches.get("default", "default_branch"))
63
+ return {"selected_branch": chosen_branch}
64
+
65
+ async def _execute_transform(self, task: TaskInstance) -> Dict[str, Any]:
66
+ mapping = task.task_def.input_parameters.get("mapping", {})
67
+ transformed = {}
68
+ for out_key, in_path in mapping.items():
69
+ transformed[out_key] = task.input_data.get(in_path)
70
+ return transformed