getcodexy 1.7.2__tar.gz → 1.8.0__tar.gz

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 (86) hide show
  1. {getcodexy-1.7.2 → getcodexy-1.8.0}/PKG-INFO +1 -1
  2. {getcodexy-1.7.2 → getcodexy-1.8.0}/pyproject.toml +1 -1
  3. {getcodexy-1.7.2 → getcodexy-1.8.0}/src/codexy_runtime_tools/_version_data/uv.lock +1 -1
  4. {getcodexy-1.7.2 → getcodexy-1.8.0}/src/codexy_runtime_tools/component-manifest.json +8 -8
  5. {getcodexy-1.7.2 → getcodexy-1.8.0}/src/codexy_runtime_tools/component_core_hooks.py +6 -1
  6. {getcodexy-1.7.2 → getcodexy-1.8.0}/src/codexy_runtime_tools/component_hook_activation_expected.py +2 -0
  7. getcodexy-1.8.0/src/codexy_runtime_tools/component_registration_files.py +47 -0
  8. {getcodexy-1.7.2 → getcodexy-1.8.0}/src/codexy_runtime_tools/component_registration_health.py +32 -43
  9. {getcodexy-1.7.2 → getcodexy-1.8.0}/uv.lock +1 -1
  10. {getcodexy-1.7.2 → getcodexy-1.8.0}/README.md +0 -0
  11. {getcodexy-1.7.2 → getcodexy-1.8.0}/build_backend.py +0 -0
  12. {getcodexy-1.7.2 → getcodexy-1.8.0}/src/codexy_runtime_tools/__init__.py +0 -0
  13. {getcodexy-1.7.2 → getcodexy-1.8.0}/src/codexy_runtime_tools/activation_transaction.py +0 -0
  14. {getcodexy-1.7.2 → getcodexy-1.8.0}/src/codexy_runtime_tools/cache.py +0 -0
  15. {getcodexy-1.7.2 → getcodexy-1.8.0}/src/codexy_runtime_tools/component_capability_observation.py +0 -0
  16. {getcodexy-1.7.2 → getcodexy-1.8.0}/src/codexy_runtime_tools/component_capability_probe.py +0 -0
  17. {getcodexy-1.7.2 → getcodexy-1.8.0}/src/codexy_runtime_tools/component_capability_probe_process.py +0 -0
  18. {getcodexy-1.7.2 → getcodexy-1.8.0}/src/codexy_runtime_tools/component_cli.py +0 -0
  19. {getcodexy-1.7.2 → getcodexy-1.8.0}/src/codexy_runtime_tools/component_health.py +0 -0
  20. {getcodexy-1.7.2 → getcodexy-1.8.0}/src/codexy_runtime_tools/component_health_support.py +0 -0
  21. {getcodexy-1.7.2 → getcodexy-1.8.0}/src/codexy_runtime_tools/component_hook_activation.py +0 -0
  22. {getcodexy-1.7.2 → getcodexy-1.8.0}/src/codexy_runtime_tools/component_hook_activation_host.py +0 -0
  23. {getcodexy-1.7.2 → getcodexy-1.8.0}/src/codexy_runtime_tools/component_hook_activation_validation.py +0 -0
  24. {getcodexy-1.7.2 → getcodexy-1.8.0}/src/codexy_runtime_tools/component_inspection.py +0 -0
  25. {getcodexy-1.7.2 → getcodexy-1.8.0}/src/codexy_runtime_tools/component_inspection_host.py +0 -0
  26. {getcodexy-1.7.2 → getcodexy-1.8.0}/src/codexy_runtime_tools/component_inspection_types.py +0 -0
  27. {getcodexy-1.7.2 → getcodexy-1.8.0}/src/codexy_runtime_tools/component_integrity.py +0 -0
  28. {getcodexy-1.7.2 → getcodexy-1.8.0}/src/codexy_runtime_tools/component_interactive_probe.py +0 -0
  29. {getcodexy-1.7.2 → getcodexy-1.8.0}/src/codexy_runtime_tools/component_inventory_classification.py +0 -0
  30. {getcodexy-1.7.2 → getcodexy-1.8.0}/src/codexy_runtime_tools/component_inventory_records.py +0 -0
  31. {getcodexy-1.7.2 → getcodexy-1.8.0}/src/codexy_runtime_tools/component_lifecycle.py +0 -0
  32. {getcodexy-1.7.2 → getcodexy-1.8.0}/src/codexy_runtime_tools/component_lifecycle_admission.py +0 -0
  33. {getcodexy-1.7.2 → getcodexy-1.8.0}/src/codexy_runtime_tools/component_lifecycle_finish.py +0 -0
  34. {getcodexy-1.7.2 → getcodexy-1.8.0}/src/codexy_runtime_tools/component_lifecycle_interlock.py +0 -0
  35. {getcodexy-1.7.2 → getcodexy-1.8.0}/src/codexy_runtime_tools/component_lifecycle_mcp.py +0 -0
  36. {getcodexy-1.7.2 → getcodexy-1.8.0}/src/codexy_runtime_tools/component_lifecycle_operation.py +0 -0
  37. {getcodexy-1.7.2 → getcodexy-1.8.0}/src/codexy_runtime_tools/component_lifecycle_preflight.py +0 -0
  38. {getcodexy-1.7.2 → getcodexy-1.8.0}/src/codexy_runtime_tools/component_lifecycle_recovery.py +0 -0
  39. {getcodexy-1.7.2 → getcodexy-1.8.0}/src/codexy_runtime_tools/component_lifecycle_support.py +0 -0
  40. {getcodexy-1.7.2 → getcodexy-1.8.0}/src/codexy_runtime_tools/component_lifecycle_terminal.py +0 -0
  41. {getcodexy-1.7.2 → getcodexy-1.8.0}/src/codexy_runtime_tools/component_manifest.py +0 -0
  42. {getcodexy-1.7.2 → getcodexy-1.8.0}/src/codexy_runtime_tools/component_manifest_dependencies.py +0 -0
  43. {getcodexy-1.7.2 → getcodexy-1.8.0}/src/codexy_runtime_tools/component_manifest_values.py +0 -0
  44. {getcodexy-1.7.2 → getcodexy-1.8.0}/src/codexy_runtime_tools/component_mcp_cache.py +0 -0
  45. {getcodexy-1.7.2 → getcodexy-1.8.0}/src/codexy_runtime_tools/component_mcp_materialization.py +0 -0
  46. {getcodexy-1.7.2 → getcodexy-1.8.0}/src/codexy_runtime_tools/component_mcp_probe.py +0 -0
  47. {getcodexy-1.7.2 → getcodexy-1.8.0}/src/codexy_runtime_tools/component_observed_inventory.py +0 -0
  48. {getcodexy-1.7.2 → getcodexy-1.8.0}/src/codexy_runtime_tools/component_resolver.py +0 -0
  49. {getcodexy-1.7.2 → getcodexy-1.8.0}/src/codexy_runtime_tools/component_transaction_durability.py +0 -0
  50. {getcodexy-1.7.2 → getcodexy-1.8.0}/src/codexy_runtime_tools/component_transaction_identity.py +0 -0
  51. {getcodexy-1.7.2 → getcodexy-1.8.0}/src/codexy_runtime_tools/component_transaction_receipts.py +0 -0
  52. {getcodexy-1.7.2 → getcodexy-1.8.0}/src/codexy_runtime_tools/component_transaction_snapshot.py +0 -0
  53. {getcodexy-1.7.2 → getcodexy-1.8.0}/src/codexy_runtime_tools/component_transaction_state.py +0 -0
  54. {getcodexy-1.7.2 → getcodexy-1.8.0}/src/codexy_runtime_tools/component_transition_journal.py +0 -0
  55. {getcodexy-1.7.2 → getcodexy-1.8.0}/src/codexy_runtime_tools/component_transition_model.py +0 -0
  56. {getcodexy-1.7.2 → getcodexy-1.8.0}/src/codexy_runtime_tools/component_transition_receipt.py +0 -0
  57. {getcodexy-1.7.2 → getcodexy-1.8.0}/src/codexy_runtime_tools/component_transition_rejections.py +0 -0
  58. {getcodexy-1.7.2 → getcodexy-1.8.0}/src/codexy_runtime_tools/component_watcher_probe.py +0 -0
  59. {getcodexy-1.7.2 → getcodexy-1.8.0}/src/codexy_runtime_tools/contract.py +0 -0
  60. {getcodexy-1.7.2 → getcodexy-1.8.0}/src/codexy_runtime_tools/github_checks.py +0 -0
  61. {getcodexy-1.7.2 → getcodexy-1.8.0}/src/codexy_runtime_tools/github_pre_session.py +0 -0
  62. {getcodexy-1.7.2 → getcodexy-1.8.0}/src/codexy_runtime_tools/identity.py +0 -0
  63. {getcodexy-1.7.2 → getcodexy-1.8.0}/src/codexy_runtime_tools/installer.py +0 -0
  64. {getcodexy-1.7.2 → getcodexy-1.8.0}/src/codexy_runtime_tools/local_marketplace.py +0 -0
  65. {getcodexy-1.7.2 → getcodexy-1.8.0}/src/codexy_runtime_tools/marketplace_identity.py +0 -0
  66. {getcodexy-1.7.2 → getcodexy-1.8.0}/src/codexy_runtime_tools/marketplace_repin.py +0 -0
  67. {getcodexy-1.7.2 → getcodexy-1.8.0}/src/codexy_runtime_tools/mcp_bootstrap.py +0 -0
  68. {getcodexy-1.7.2 → getcodexy-1.8.0}/src/codexy_runtime_tools/monolith_baseline.py +0 -0
  69. {getcodexy-1.7.2 → getcodexy-1.8.0}/src/codexy_runtime_tools/monolith_classifier.py +0 -0
  70. {getcodexy-1.7.2 → getcodexy-1.8.0}/src/codexy_runtime_tools/monolith_migration.py +0 -0
  71. {getcodexy-1.7.2 → getcodexy-1.8.0}/src/codexy_runtime_tools/monolith_migration_host.py +0 -0
  72. {getcodexy-1.7.2 → getcodexy-1.8.0}/src/codexy_runtime_tools/monolith_migration_plan.py +0 -0
  73. {getcodexy-1.7.2 → getcodexy-1.8.0}/src/codexy_runtime_tools/monolith_migration_state.py +0 -0
  74. {getcodexy-1.7.2 → getcodexy-1.8.0}/src/codexy_runtime_tools/package.py +0 -0
  75. {getcodexy-1.7.2 → getcodexy-1.8.0}/src/codexy_runtime_tools/package_archive.py +0 -0
  76. {getcodexy-1.7.2 → getcodexy-1.8.0}/src/codexy_runtime_tools/plugin_resolution.py +0 -0
  77. {getcodexy-1.7.2 → getcodexy-1.8.0}/src/codexy_runtime_tools/pre_session.py +0 -0
  78. {getcodexy-1.7.2 → getcodexy-1.8.0}/src/codexy_runtime_tools/release_contract_validation.py +0 -0
  79. {getcodexy-1.7.2 → getcodexy-1.8.0}/src/codexy_runtime_tools/release_provenance.py +0 -0
  80. {getcodexy-1.7.2 → getcodexy-1.8.0}/src/codexy_runtime_tools/release_watcher_contract.py +0 -0
  81. {getcodexy-1.7.2 → getcodexy-1.8.0}/src/codexy_runtime_tools/runtime.py +0 -0
  82. {getcodexy-1.7.2 → getcodexy-1.8.0}/src/codexy_runtime_tools/runtime_configuration.py +0 -0
  83. {getcodexy-1.7.2 → getcodexy-1.8.0}/src/codexy_runtime_tools/source.py +0 -0
  84. {getcodexy-1.7.2 → getcodexy-1.8.0}/src/codexy_runtime_tools/title_policy.py +0 -0
  85. {getcodexy-1.7.2 → getcodexy-1.8.0}/src/codexy_runtime_tools/updater.py +0 -0
  86. {getcodexy-1.7.2 → getcodexy-1.8.0}/src/codexy_runtime_tools/version_lock.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: getcodexy
3
- Version: 1.7.2
3
+ Version: 1.8.0
4
4
  Summary: A Codex harness for coordinating agents through planning, implementation, verification, and review.
5
5
  Author: Eunsoo Lee
6
6
  License-Expression: MIT
@@ -5,7 +5,7 @@ backend-path = ["."]
5
5
 
6
6
  [project]
7
7
  name = "getcodexy"
8
- version = "1.7.2"
8
+ version = "1.8.0"
9
9
  description = "A Codex harness for coordinating agents through planning, implementation, verification, and review."
10
10
  readme = { file = "README.md", content-type = "text/markdown" }
11
11
  requires-python = ">=3.10"
@@ -4,5 +4,5 @@ requires-python = ">=3.10"
4
4
 
5
5
  [[package]]
6
6
  name = "getcodexy"
7
- version = "1.7.2"
7
+ version = "1.8.0"
8
8
  source = { editable = "." }
@@ -29,7 +29,7 @@
29
29
  {
30
30
  "id": "core",
31
31
  "plugin": "codexy",
32
- "version": "1.7.2",
32
+ "version": "1.8.0",
33
33
  "dependencies": [],
34
34
  "asset": {
35
35
  "pluginId": "codexy@codexy",
@@ -50,7 +50,7 @@
50
50
  {
51
51
  "id": "github",
52
52
  "plugin": "codexy-github",
53
- "version": "1.7.2",
53
+ "version": "1.8.0",
54
54
  "dependencies": [
55
55
  "core"
56
56
  ],
@@ -66,7 +66,7 @@
66
66
  {
67
67
  "id": "devtools",
68
68
  "plugin": "codexy-devtools",
69
- "version": "1.7.2",
69
+ "version": "1.8.0",
70
70
  "dependencies": [
71
71
  "core"
72
72
  ],
@@ -84,27 +84,27 @@
84
84
  "compatibleCombinations": [
85
85
  {
86
86
  "components": [],
87
- "version": "1.7.2"
87
+ "version": "1.8.0"
88
88
  },
89
89
  {
90
90
  "components": [
91
91
  "core"
92
92
  ],
93
- "version": "1.7.2"
93
+ "version": "1.8.0"
94
94
  },
95
95
  {
96
96
  "components": [
97
97
  "core",
98
98
  "github"
99
99
  ],
100
- "version": "1.7.2"
100
+ "version": "1.8.0"
101
101
  },
102
102
  {
103
103
  "components": [
104
104
  "core",
105
105
  "devtools"
106
106
  ],
107
- "version": "1.7.2"
107
+ "version": "1.8.0"
108
108
  },
109
109
  {
110
110
  "components": [
@@ -112,7 +112,7 @@
112
112
  "github",
113
113
  "devtools"
114
114
  ],
115
- "version": "1.7.2"
115
+ "version": "1.8.0"
116
116
  }
117
117
  ]
118
118
  }
@@ -7,9 +7,11 @@ COMMAND_HOOKS = (
7
7
  (_TOOL_PREFIX + "create_thread$", "codexy-child-thread-creation"),
8
8
  (r"^(?:(?:agents|multi_agent_v1)__)?spawn_agent$", "codexy-subagent-ownership"),
9
9
  )
10
+ WATCHER_WAIT_HOOK = (r"^(?:mcp__[^ ]+__)?watcher_wait$", "codexy-watcher-interrupt")
11
+ LIFECYCLE_HOOKS = (WATCHER_WAIT_HOOK,)
10
12
  LAUNCHERS = tuple(
11
13
  f"hooks/{stem}.{extension}"
12
- for _, stem in COMMAND_HOOKS
14
+ for _, stem in (*COMMAND_HOOKS, *LIFECYCLE_HOOKS)
13
15
  for extension in ("sh", "cmd")
14
16
  )
15
17
  DEPENDENCIES = (
@@ -24,4 +26,7 @@ DEPENDENCIES = (
24
26
  "hooks/codexy_policy/envelope.py",
25
27
  "hooks/codexy_policy/timing.py",
26
28
  "hooks/codexy_policy/windows_timing.py",
29
+ "hooks/codexy-watcher-interrupt.sh",
30
+ "hooks/codexy-watcher-interrupt.cmd",
31
+ "hooks/codexy_watcher_interrupt.py",
27
32
  )
@@ -18,6 +18,7 @@ _EVENT_LABELS = {
18
18
  "UserPromptSubmit": "userPromptSubmit",
19
19
  "SessionStart": "sessionStart",
20
20
  "Stop": "stop",
21
+ "Interrupt": "interrupt",
21
22
  }
22
23
  _EVENT_KEYS = {
23
24
  "PreToolUse": "pre_tool_use",
@@ -25,6 +26,7 @@ _EVENT_KEYS = {
25
26
  "UserPromptSubmit": "user_prompt_submit",
26
27
  "SessionStart": "session_start",
27
28
  "Stop": "stop",
29
+ "Interrupt": "interrupt",
28
30
  }
29
31
 
30
32
 
@@ -0,0 +1,47 @@
1
+ """Bounded file checks used by component registration health."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import os
6
+ import shutil
7
+ from pathlib import Path
8
+
9
+ from .component_core_hooks import DEPENDENCIES as CORE_HOOK_DEPENDENCIES
10
+ from .component_integrity import MAX_COMPONENT_BYTES, _read_regular, valid_agent_toml
11
+ from .component_manifest import load_component_manifest
12
+
13
+
14
+ def _text(path: Path, root: Path) -> str:
15
+ return _read_regular(root, path.relative_to(root), MAX_COMPONENT_BYTES).decode()
16
+
17
+
18
+ def _regular(path: Path, root: Path, needle: str = "") -> bool:
19
+ contents = _read_regular(root, path.relative_to(root), MAX_COMPONENT_BYTES)
20
+ return bool(contents) and (not needle or valid_agent_toml(contents.decode(), path))
21
+
22
+
23
+ def _launcher(path: Path, root: Path) -> bool:
24
+ contents = _text(path, root) if _regular(path, root) else ""
25
+ if path.suffix == ".cmd":
26
+ return contents.lower().startswith("@echo off")
27
+ command = contents.splitlines()[0][2:].split() if contents.startswith("#!") else []
28
+ return (
29
+ bool(command)
30
+ and _executable(path, root)
31
+ and (os.name == "nt" or shutil.which(command[-1]) is not None)
32
+ )
33
+
34
+
35
+ def _skill(plugin: Path, component: str) -> bool:
36
+ required = load_component_manifest().component(component).asset.required_paths
37
+ if component == "core":
38
+ required += CORE_HOOK_DEPENDENCIES
39
+ name = "wiki" if component == "core" else "git-workflow"
40
+ contents = _text(plugin / f"skills/{name}/SKILL.md", plugin)
41
+ return all(_regular(plugin / path, plugin) for path in required) and (
42
+ contents.startswith(f"---\nname: {name}\n") and "\n---\n" in contents
43
+ )
44
+
45
+
46
+ def _executable(path: Path, root: Path) -> bool:
47
+ return _regular(path, root) and (os.name == "nt" or os.access(path, os.X_OK))
@@ -3,21 +3,20 @@
3
3
  from __future__ import annotations
4
4
 
5
5
  import json
6
- import os
7
- import shutil
8
6
  from pathlib import Path
9
7
 
10
8
  from .component_core_hooks import (
11
9
  COMMAND_HOOKS as _CORE_COMMAND_HOOKS,
12
10
  DEPENDENCIES as CORE_HOOK_DEPENDENCIES,
11
+ LIFECYCLE_HOOKS as _CORE_LIFECYCLE_HOOKS,
13
12
  LAUNCHERS as CORE_HOOK_LAUNCHERS,
14
13
  )
15
- from .component_integrity import MAX_COMPONENT_BYTES, _read_regular, valid_agent_toml
16
14
  from .component_mcp_materialization import (
17
15
  mcp_configuration,
18
16
  valid_component_mcp,
19
17
  )
20
18
  from .component_manifest import load_component_manifest
19
+ from .component_registration_files import _launcher, _regular, _skill, _text
21
20
 
22
21
  CATALOGS = {
23
22
  "core": """# Codexy packaged-agent discovery/registration contract. Validators and the
@@ -72,6 +71,19 @@ def _command_hook(matcher: str, launcher_stem: str, event: str) -> dict[str, obj
72
71
  }
73
72
 
74
73
 
74
+ def _lifecycle_hook(launcher_stem: str, event: str) -> dict[str, object]:
75
+ return {
76
+ "hooks": [
77
+ {
78
+ "type": "command",
79
+ "command": f'"${{PLUGIN_ROOT}}/hooks/{launcher_stem}.sh" {event}',
80
+ "commandWindows": f'"${{PLUGIN_ROOT}}/hooks/{launcher_stem}.cmd" {event}',
81
+ "timeout": 3,
82
+ }
83
+ ]
84
+ }
85
+
86
+
75
87
  def _bash_hooks(event: str) -> list[dict[str, object]]:
76
88
  return [_command_hook("^Bash$", "codexy-destructive-command", event)]
77
89
 
@@ -115,11 +127,24 @@ def _title_hook(matcher: str, kind: str, event: str) -> dict[str, object]:
115
127
  HOOKS = {
116
128
  "core": {
117
129
  "hooks": {
118
- event: [
119
- _command_hook(matcher, launcher_stem, event)
130
+ "PermissionRequest": [
131
+ _command_hook(matcher, launcher_stem, "PermissionRequest")
120
132
  for matcher, launcher_stem in _CORE_COMMAND_HOOKS
121
- ]
122
- for event in ("PermissionRequest", "PreToolUse")
133
+ ],
134
+ "PreToolUse": [
135
+ *[
136
+ _command_hook(matcher, launcher_stem, "PreToolUse")
137
+ for matcher, launcher_stem in _CORE_COMMAND_HOOKS
138
+ ],
139
+ *[
140
+ _command_hook(matcher, launcher_stem, "PreToolUse")
141
+ for matcher, launcher_stem in _CORE_LIFECYCLE_HOOKS
142
+ ],
143
+ ],
144
+ "Interrupt": [
145
+ _lifecycle_hook(launcher_stem, "Interrupt")
146
+ for _, launcher_stem in _CORE_LIFECYCLE_HOOKS
147
+ ],
123
148
  }
124
149
  },
125
150
  "github": {
@@ -187,39 +212,3 @@ def valid_registration(plugin: Path, component: str) -> bool:
187
212
  )
188
213
  except (KeyError, OSError, UnicodeDecodeError, SyntaxError, ValueError):
189
214
  return False
190
-
191
-
192
- def _text(path: Path, root: Path) -> str:
193
- return _read_regular(root, path.relative_to(root), MAX_COMPONENT_BYTES).decode()
194
-
195
-
196
- def _regular(path: Path, root: Path, needle: str = "") -> bool:
197
- contents = _read_regular(root, path.relative_to(root), MAX_COMPONENT_BYTES)
198
- return bool(contents) and (not needle or valid_agent_toml(contents.decode(), path))
199
-
200
-
201
- def _launcher(path: Path, root: Path) -> bool:
202
- contents = _text(path, root) if _regular(path, root) else ""
203
- if path.suffix == ".cmd":
204
- return contents.lower().startswith("@echo off")
205
- command = contents.splitlines()[0][2:].split() if contents.startswith("#!") else []
206
- return (
207
- bool(command)
208
- and _executable(path, root)
209
- and (os.name == "nt" or shutil.which(command[-1]) is not None)
210
- )
211
-
212
-
213
- def _skill(plugin: Path, component: str) -> bool:
214
- required = load_component_manifest().component(component).asset.required_paths
215
- if component == "core":
216
- required += CORE_HOOK_DEPENDENCIES
217
- name = "wiki" if component == "core" else "git-workflow"
218
- contents = _text(plugin / f"skills/{name}/SKILL.md", plugin)
219
- return all(_regular(plugin / path, plugin) for path in required) and (
220
- contents.startswith(f"---\nname: {name}\n") and "\n---\n" in contents
221
- )
222
-
223
-
224
- def _executable(path: Path, root: Path) -> bool:
225
- return _regular(path, root) and (os.name == "nt" or os.access(path, os.X_OK))
@@ -4,5 +4,5 @@ requires-python = ">=3.10"
4
4
 
5
5
  [[package]]
6
6
  name = "getcodexy"
7
- version = "1.7.2"
7
+ version = "1.8.0"
8
8
  source = { editable = "." }
File without changes
File without changes