pathly-adapters 2.0.3__tar.gz → 2.3.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 (260) hide show
  1. {pathly_adapters-2.0.3 → pathly_adapters-2.3.0}/PKG-INFO +2 -1
  2. {pathly_adapters-2.0.3 → pathly_adapters-2.3.0}/README.md +12 -5
  3. {pathly_adapters-2.0.3 → pathly_adapters-2.3.0}/pyproject.toml +5 -3
  4. {pathly_adapters-2.0.3 → pathly_adapters-2.3.0}/src/install_cli/codex_plugin_config.py +170 -122
  5. {pathly_adapters-2.0.3 → pathly_adapters-2.3.0}/src/install_cli/detect.py +21 -21
  6. pathly_adapters-2.3.0/src/install_cli/materialize.py +285 -0
  7. {pathly_adapters-2.0.3 → pathly_adapters-2.3.0}/src/install_cli/resources.py +42 -34
  8. {pathly_adapters-2.0.3 → pathly_adapters-2.3.0}/src/install_cli/setup_command.py +218 -106
  9. {pathly_adapters-2.0.3 → pathly_adapters-2.3.0}/src/install_cli/stitch.py +78 -75
  10. {pathly_adapters-2.0.3 → pathly_adapters-2.3.0}/src/pathly_adapters.egg-info/PKG-INFO +2 -1
  11. {pathly_adapters-2.0.3 → pathly_adapters-2.3.0}/src/pathly_adapters.egg-info/SOURCES.txt +44 -29
  12. pathly_adapters-2.3.0/src/pathly_adapters.egg-info/entry_points.txt +5 -0
  13. {pathly_adapters-2.0.3 → pathly_adapters-2.3.0}/src/pathly_adapters.egg-info/requires.txt +1 -0
  14. {pathly_adapters-2.0.3 → pathly_adapters-2.3.0}/src/pathly_adapters.egg-info/top_level.txt +2 -0
  15. {pathly_adapters-2.0.3 → pathly_adapters-2.3.0}/src/pathly_data/adapters/claude/.claude-plugin/plugin.json +1 -1
  16. {pathly_adapters-2.0.3 → pathly_adapters-2.3.0}/src/pathly_data/adapters/claude/_meta/architect.yaml +5 -5
  17. {pathly_adapters-2.0.3 → pathly_adapters-2.3.0}/src/pathly_data/adapters/claude/_meta/director.yaml +4 -4
  18. {pathly_adapters-2.0.3 → pathly_adapters-2.3.0}/src/pathly_data/adapters/claude/_meta/explorer.yaml +5 -4
  19. {pathly_adapters-2.0.3 → pathly_adapters-2.3.0}/src/pathly_data/adapters/claude/_meta/orchestrator.yaml +12 -5
  20. {pathly_adapters-2.0.3 → pathly_adapters-2.3.0}/src/pathly_data/adapters/claude/_meta/pathly_skill.yaml +3 -3
  21. {pathly_adapters-2.0.3 → pathly_adapters-2.3.0}/src/pathly_data/adapters/claude/_meta/planner.yaml +5 -5
  22. {pathly_adapters-2.0.3 → pathly_adapters-2.3.0}/src/pathly_data/adapters/claude/_meta/po.yaml +5 -5
  23. {pathly_adapters-2.0.3 → pathly_adapters-2.3.0}/src/pathly_data/adapters/claude/_meta/quick.yaml +4 -4
  24. {pathly_adapters-2.0.3 → pathly_adapters-2.3.0}/src/pathly_data/adapters/claude/_meta/reviewer.yaml +5 -5
  25. pathly_adapters-2.3.0/src/pathly_data/adapters/claude/_meta/scout-path_skill.yaml +3 -0
  26. {pathly_adapters-2.0.3 → pathly_adapters-2.3.0}/src/pathly_data/adapters/claude/_meta/scout.yaml +4 -4
  27. pathly_adapters-2.3.0/src/pathly_data/adapters/claude/_meta/team-build_skill.yaml +3 -0
  28. pathly_adapters-2.3.0/src/pathly_data/adapters/claude/_meta/team-discover_skill.yaml +3 -0
  29. pathly_adapters-2.3.0/src/pathly_data/adapters/claude/_meta/team-plan_skill.yaml +3 -0
  30. pathly_adapters-2.3.0/src/pathly_data/adapters/claude/_meta/team-retro_skill.yaml +5 -0
  31. pathly_adapters-2.3.0/src/pathly_data/adapters/claude/_meta/team-review_skill.yaml +3 -0
  32. pathly_adapters-2.3.0/src/pathly_data/adapters/claude/_meta/team-test_skill.yaml +3 -0
  33. pathly_adapters-2.3.0/src/pathly_data/adapters/claude/_meta/team_skill.yaml +3 -0
  34. {pathly_adapters-2.0.3 → pathly_adapters-2.3.0}/src/pathly_data/adapters/claude/_meta/tester.yaml +5 -5
  35. {pathly_adapters-2.0.3 → pathly_adapters-2.3.0}/src/pathly_data/adapters/claude/_meta/web-researcher.yaml +4 -4
  36. {pathly_adapters-2.0.3 → pathly_adapters-2.3.0}/src/pathly_data/adapters/codex/.codex-plugin/plugin.json +3 -3
  37. {pathly_adapters-2.0.3 → pathly_adapters-2.3.0}/src/pathly_data/adapters/codex/README.md +11 -4
  38. {pathly_adapters-2.0.3 → pathly_adapters-2.3.0}/src/pathly_data/adapters/codex/_meta/architect.yaml +4 -4
  39. {pathly_adapters-2.0.3 → pathly_adapters-2.3.0}/src/pathly_data/adapters/codex/_meta/director.yaml +3 -3
  40. {pathly_adapters-2.0.3 → pathly_adapters-2.3.0}/src/pathly_data/adapters/codex/_meta/explorer.yaml +4 -3
  41. {pathly_adapters-2.0.3 → pathly_adapters-2.3.0}/src/pathly_data/adapters/codex/_meta/install.yaml +13 -9
  42. {pathly_adapters-2.0.3 → pathly_adapters-2.3.0}/src/pathly_data/adapters/codex/_meta/orchestrator.yaml +11 -4
  43. {pathly_adapters-2.0.3 → pathly_adapters-2.3.0}/src/pathly_data/adapters/codex/_meta/pathly_skill.yaml +3 -3
  44. {pathly_adapters-2.0.3 → pathly_adapters-2.3.0}/src/pathly_data/adapters/codex/_meta/planner.yaml +4 -4
  45. {pathly_adapters-2.0.3 → pathly_adapters-2.3.0}/src/pathly_data/adapters/codex/_meta/po.yaml +4 -4
  46. {pathly_adapters-2.0.3 → pathly_adapters-2.3.0}/src/pathly_data/adapters/codex/_meta/quick.yaml +3 -3
  47. {pathly_adapters-2.0.3 → pathly_adapters-2.3.0}/src/pathly_data/adapters/codex/_meta/reviewer.yaml +4 -4
  48. pathly_adapters-2.3.0/src/pathly_data/adapters/codex/_meta/scout-path_skill.yaml +3 -0
  49. {pathly_adapters-2.0.3 → pathly_adapters-2.3.0}/src/pathly_data/adapters/codex/_meta/scout.yaml +3 -3
  50. pathly_adapters-2.3.0/src/pathly_data/adapters/codex/_meta/team-build_skill.yaml +3 -0
  51. pathly_adapters-2.3.0/src/pathly_data/adapters/codex/_meta/team-discover_skill.yaml +3 -0
  52. pathly_adapters-2.3.0/src/pathly_data/adapters/codex/_meta/team-plan_skill.yaml +3 -0
  53. pathly_adapters-2.3.0/src/pathly_data/adapters/codex/_meta/team-retro_skill.yaml +5 -0
  54. pathly_adapters-2.3.0/src/pathly_data/adapters/codex/_meta/team-review_skill.yaml +3 -0
  55. pathly_adapters-2.3.0/src/pathly_data/adapters/codex/_meta/team-test_skill.yaml +3 -0
  56. pathly_adapters-2.3.0/src/pathly_data/adapters/codex/_meta/team_skill.yaml +3 -0
  57. {pathly_adapters-2.0.3 → pathly_adapters-2.3.0}/src/pathly_data/adapters/codex/_meta/tester.yaml +4 -4
  58. {pathly_adapters-2.0.3 → pathly_adapters-2.3.0}/src/pathly_data/adapters/codex/_meta/web-researcher.yaml +3 -3
  59. {pathly_adapters-2.0.3 → pathly_adapters-2.3.0}/src/pathly_data/adapters/copilot/_meta/architect.yaml +4 -4
  60. {pathly_adapters-2.0.3 → pathly_adapters-2.3.0}/src/pathly_data/adapters/copilot/_meta/builder.yaml +5 -5
  61. {pathly_adapters-2.0.3 → pathly_adapters-2.3.0}/src/pathly_data/adapters/copilot/_meta/director.yaml +4 -4
  62. {pathly_adapters-2.0.3 → pathly_adapters-2.3.0}/src/pathly_data/adapters/copilot/_meta/explorer.yaml +4 -4
  63. {pathly_adapters-2.0.3 → pathly_adapters-2.3.0}/src/pathly_data/adapters/copilot/_meta/install.yaml +14 -9
  64. {pathly_adapters-2.0.3 → pathly_adapters-2.3.0}/src/pathly_data/adapters/copilot/_meta/orchestrator.yaml +4 -4
  65. {pathly_adapters-2.0.3 → pathly_adapters-2.3.0}/src/pathly_data/adapters/copilot/_meta/pathly_skill.yaml +3 -3
  66. {pathly_adapters-2.0.3 → pathly_adapters-2.3.0}/src/pathly_data/adapters/copilot/_meta/planner.yaml +4 -4
  67. {pathly_adapters-2.0.3 → pathly_adapters-2.3.0}/src/pathly_data/adapters/copilot/_meta/po.yaml +4 -4
  68. {pathly_adapters-2.0.3 → pathly_adapters-2.3.0}/src/pathly_data/adapters/copilot/_meta/quick.yaml +4 -4
  69. {pathly_adapters-2.0.3 → pathly_adapters-2.3.0}/src/pathly_data/adapters/copilot/_meta/reviewer.yaml +4 -4
  70. pathly_adapters-2.3.0/src/pathly_data/adapters/copilot/_meta/scout-path_skill.yaml +3 -0
  71. {pathly_adapters-2.0.3 → pathly_adapters-2.3.0}/src/pathly_data/adapters/copilot/_meta/scout.yaml +4 -4
  72. pathly_adapters-2.3.0/src/pathly_data/adapters/copilot/_meta/team-build_skill.yaml +3 -0
  73. pathly_adapters-2.3.0/src/pathly_data/adapters/copilot/_meta/team-discover_skill.yaml +3 -0
  74. pathly_adapters-2.3.0/src/pathly_data/adapters/copilot/_meta/team-plan_skill.yaml +3 -0
  75. pathly_adapters-2.3.0/src/pathly_data/adapters/copilot/_meta/team-retro_skill.yaml +5 -0
  76. pathly_adapters-2.3.0/src/pathly_data/adapters/copilot/_meta/team-review_skill.yaml +3 -0
  77. pathly_adapters-2.3.0/src/pathly_data/adapters/copilot/_meta/team-test_skill.yaml +3 -0
  78. pathly_adapters-2.3.0/src/pathly_data/adapters/copilot/_meta/team_skill.yaml +3 -0
  79. {pathly_adapters-2.0.3 → pathly_adapters-2.3.0}/src/pathly_data/adapters/copilot/_meta/tester.yaml +4 -4
  80. {pathly_adapters-2.0.3 → pathly_adapters-2.3.0}/src/pathly_data/adapters/copilot/_meta/web-researcher.yaml +4 -4
  81. {pathly_adapters-2.0.3 → pathly_adapters-2.3.0}/src/pathly_data/core/SKILLS_OVERVIEW.md +883 -883
  82. {pathly_adapters-2.0.3 → pathly_adapters-2.3.0}/src/pathly_data/core/agents/builder.md +26 -0
  83. {pathly_adapters-2.0.3 → pathly_adapters-2.3.0}/src/pathly_data/core/agents/explorer.md +130 -103
  84. pathly_adapters-2.3.0/src/pathly_data/core/agents/orchestrator.md +159 -0
  85. {pathly_adapters-2.0.3 → pathly_adapters-2.3.0}/src/pathly_data/core/agents/planner.md +40 -32
  86. {pathly_adapters-2.0.3 → pathly_adapters-2.3.0}/src/pathly_data/core/agents/po.md +30 -30
  87. {pathly_adapters-2.0.3 → pathly_adapters-2.3.0}/src/pathly_data/core/agents/tester.md +35 -12
  88. pathly_adapters-2.3.0/src/pathly_data/core/flows/debug.flow.yaml +37 -0
  89. pathly_adapters-2.3.0/src/pathly_data/core/flows/explore.flow.yaml +30 -0
  90. pathly_adapters-2.3.0/src/pathly_data/core/flows/team.flow.yaml +73 -0
  91. {pathly_adapters-2.0.3 → pathly_adapters-2.3.0}/src/pathly_data/core/skills/archive.md +1 -1
  92. {pathly_adapters-2.0.3 → pathly_adapters-2.3.0}/src/pathly_data/core/skills/build.md +24 -65
  93. pathly_adapters-2.3.0/src/pathly_data/core/skills/debug.md +76 -0
  94. pathly_adapters-2.3.0/src/pathly_data/core/skills/explore.md +75 -0
  95. {pathly_adapters-2.0.3 → pathly_adapters-2.3.0}/src/pathly_data/core/skills/go.md +16 -16
  96. {pathly_adapters-2.0.3 → pathly_adapters-2.3.0}/src/pathly_data/core/skills/help.md +8 -8
  97. {pathly_adapters-2.0.3 → pathly_adapters-2.3.0}/src/pathly_data/core/skills/meet.md +2 -2
  98. {pathly_adapters-2.0.3 → pathly_adapters-2.3.0}/src/pathly_data/core/skills/pathly.md +358 -358
  99. {pathly_adapters-2.0.3 → pathly_adapters-2.3.0}/src/pathly_data/core/skills/pause.md +43 -43
  100. {pathly_adapters-2.0.3 → pathly_adapters-2.3.0}/src/pathly_data/core/skills/plan.md +2 -2
  101. {pathly_adapters-2.0.3 → pathly_adapters-2.3.0}/src/pathly_data/core/skills/po.md +146 -146
  102. {pathly_adapters-2.0.3 → pathly_adapters-2.3.0}/src/pathly_data/core/skills/prd-import.md +1 -1
  103. {pathly_adapters-2.0.3 → pathly_adapters-2.3.0}/src/pathly_data/core/skills/review.md +4 -1
  104. pathly_adapters-2.0.3/src/pathly_data/core/skills/scout-flow.md → pathly_adapters-2.3.0/src/pathly_data/core/skills/scout-path.md +85 -83
  105. {pathly_adapters-2.0.3/src/pathly_data/core/skills/team-flow → pathly_adapters-2.3.0/src/pathly_data/core/skills/team}/build.md +128 -132
  106. {pathly_adapters-2.0.3/src/pathly_data/core/skills/team-flow → pathly_adapters-2.3.0/src/pathly_data/core/skills/team}/discover.md +193 -192
  107. {pathly_adapters-2.0.3/src/pathly_data/core/skills/team-flow → pathly_adapters-2.3.0/src/pathly_data/core/skills/team}/plan.md +49 -35
  108. {pathly_adapters-2.0.3/src/pathly_data/core/skills/team-flow → pathly_adapters-2.3.0/src/pathly_data/core/skills/team}/retro.md +3 -3
  109. {pathly_adapters-2.0.3/src/pathly_data/core/skills/team-flow → pathly_adapters-2.3.0/src/pathly_data/core/skills/team}/review.md +166 -167
  110. {pathly_adapters-2.0.3/src/pathly_data/core/skills/team-flow → pathly_adapters-2.3.0/src/pathly_data/core/skills/team}/test.md +128 -127
  111. pathly_adapters-2.3.0/src/pathly_data/core/skills/team.md +104 -0
  112. {pathly_adapters-2.0.3 → pathly_adapters-2.3.0}/src/pathly_data/core/skills/test.md +139 -140
  113. {pathly_adapters-2.0.3 → pathly_adapters-2.3.0}/src/pathly_data/core/templates/plan/FEATURE_INDEX.template.md +61 -61
  114. pathly_adapters-2.3.0/src/pathly_data/schemas/pathly-meta.schema.json +116 -0
  115. pathly_adapters-2.3.0/src/pathly_hooks/__init__.py +5 -0
  116. pathly_adapters-2.3.0/src/pathly_hooks/classify_feedback.py +73 -0
  117. pathly_adapters-2.3.0/src/pathly_hooks/inject_feedback_ttl.py +81 -0
  118. pathly_adapters-2.3.0/src/pathly_orchestrator/__init__.py +8 -0
  119. pathly_adapters-2.3.0/src/pathly_orchestrator/eventlog.py +235 -0
  120. pathly_adapters-2.3.0/src/pathly_orchestrator/events.py +83 -0
  121. pathly_adapters-2.3.0/src/pathly_orchestrator/state.py +81 -0
  122. {pathly_adapters-2.0.3 → pathly_adapters-2.3.0}/src/pathly_telemetry/__init__.py +1 -1
  123. {pathly_adapters-2.0.3 → pathly_adapters-2.3.0}/src/pathly_telemetry/__main__.py +14 -14
  124. {pathly_adapters-2.0.3 → pathly_adapters-2.3.0}/src/pathly_telemetry/report.py +80 -80
  125. {pathly_adapters-2.0.3 → pathly_adapters-2.3.0}/src/pathly_telemetry/storage.py +28 -28
  126. {pathly_adapters-2.0.3 → pathly_adapters-2.3.0}/tests/test_codex_plugin_config.py +122 -67
  127. {pathly_adapters-2.0.3 → pathly_adapters-2.3.0}/tests/test_feedback_protocol.py +9 -0
  128. {pathly_adapters-2.0.3 → pathly_adapters-2.3.0}/tests/test_hooks.py +34 -2
  129. pathly_adapters-2.3.0/tests/test_materialize_hooks.py +116 -0
  130. pathly_adapters-2.3.0/tests/test_orchestrator.py +206 -0
  131. {pathly_adapters-2.0.3 → pathly_adapters-2.3.0}/tests/test_setup.py +23 -21
  132. pathly_adapters-2.0.3/src/install_cli/materialize.py +0 -107
  133. pathly_adapters-2.0.3/src/pathly_adapters.egg-info/entry_points.txt +0 -3
  134. pathly_adapters-2.0.3/src/pathly_data/adapters/claude/_meta/team-flow-build_skill.yaml +0 -3
  135. pathly_adapters-2.0.3/src/pathly_data/adapters/claude/_meta/team-flow-discover_skill.yaml +0 -3
  136. pathly_adapters-2.0.3/src/pathly_data/adapters/claude/_meta/team-flow-plan_skill.yaml +0 -3
  137. pathly_adapters-2.0.3/src/pathly_data/adapters/claude/_meta/team-flow-retro_skill.yaml +0 -5
  138. pathly_adapters-2.0.3/src/pathly_data/adapters/claude/_meta/team-flow-review_skill.yaml +0 -3
  139. pathly_adapters-2.0.3/src/pathly_data/adapters/claude/_meta/team-flow-test_skill.yaml +0 -3
  140. pathly_adapters-2.0.3/src/pathly_data/adapters/claude/_meta/team-flow_skill.yaml +0 -3
  141. pathly_adapters-2.0.3/src/pathly_data/adapters/codex/_meta/team-flow-build_skill.yaml +0 -3
  142. pathly_adapters-2.0.3/src/pathly_data/adapters/codex/_meta/team-flow-discover_skill.yaml +0 -3
  143. pathly_adapters-2.0.3/src/pathly_data/adapters/codex/_meta/team-flow-plan_skill.yaml +0 -3
  144. pathly_adapters-2.0.3/src/pathly_data/adapters/codex/_meta/team-flow-retro_skill.yaml +0 -5
  145. pathly_adapters-2.0.3/src/pathly_data/adapters/codex/_meta/team-flow-review_skill.yaml +0 -3
  146. pathly_adapters-2.0.3/src/pathly_data/adapters/codex/_meta/team-flow-test_skill.yaml +0 -3
  147. pathly_adapters-2.0.3/src/pathly_data/adapters/codex/_meta/team-flow_skill.yaml +0 -3
  148. pathly_adapters-2.0.3/src/pathly_data/adapters/copilot/_meta/team-flow-build_skill.yaml +0 -3
  149. pathly_adapters-2.0.3/src/pathly_data/adapters/copilot/_meta/team-flow-discover_skill.yaml +0 -3
  150. pathly_adapters-2.0.3/src/pathly_data/adapters/copilot/_meta/team-flow-plan_skill.yaml +0 -3
  151. pathly_adapters-2.0.3/src/pathly_data/adapters/copilot/_meta/team-flow-retro_skill.yaml +0 -5
  152. pathly_adapters-2.0.3/src/pathly_data/adapters/copilot/_meta/team-flow-review_skill.yaml +0 -3
  153. pathly_adapters-2.0.3/src/pathly_data/adapters/copilot/_meta/team-flow-test_skill.yaml +0 -3
  154. pathly_adapters-2.0.3/src/pathly_data/adapters/copilot/_meta/team-flow_skill.yaml +0 -3
  155. pathly_adapters-2.0.3/src/pathly_data/core/agents/orchestrator.md +0 -116
  156. pathly_adapters-2.0.3/src/pathly_data/core/skills/debug.md +0 -238
  157. pathly_adapters-2.0.3/src/pathly_data/core/skills/explore.md +0 -171
  158. pathly_adapters-2.0.3/src/pathly_data/core/skills/team-flow.md +0 -165
  159. pathly_adapters-2.0.3/src/pathly_data/schemas/pathly-meta.schema.json +0 -40
  160. {pathly_adapters-2.0.3 → pathly_adapters-2.3.0}/setup.cfg +0 -0
  161. {pathly_adapters-2.0.3 → pathly_adapters-2.3.0}/src/install_cli/__init__.py +0 -0
  162. {pathly_adapters-2.0.3 → pathly_adapters-2.3.0}/src/install_cli/__main__.py +0 -0
  163. {pathly_adapters-2.0.3 → pathly_adapters-2.3.0}/src/install_cli/mcp_config.py +0 -0
  164. {pathly_adapters-2.0.3 → pathly_adapters-2.3.0}/src/pathly_adapters.egg-info/dependency_links.txt +0 -0
  165. {pathly_adapters-2.0.3 → pathly_adapters-2.3.0}/src/pathly_data/__init__.py +0 -0
  166. {pathly_adapters-2.0.3 → pathly_adapters-2.3.0}/src/pathly_data/adapters/claude/.claude-plugin/marketplace.json +0 -0
  167. {pathly_adapters-2.0.3 → pathly_adapters-2.3.0}/src/pathly_data/adapters/claude/README.md +0 -0
  168. {pathly_adapters-2.0.3 → pathly_adapters-2.3.0}/src/pathly_data/adapters/claude/_meta/archive_skill.yaml +0 -0
  169. {pathly_adapters-2.0.3 → pathly_adapters-2.3.0}/src/pathly_data/adapters/claude/_meta/build_skill.yaml +0 -0
  170. {pathly_adapters-2.0.3 → pathly_adapters-2.3.0}/src/pathly_data/adapters/claude/_meta/builder.yaml +0 -0
  171. {pathly_adapters-2.0.3 → pathly_adapters-2.3.0}/src/pathly_data/adapters/claude/_meta/debug_skill.yaml +0 -0
  172. {pathly_adapters-2.0.3 → pathly_adapters-2.3.0}/src/pathly_data/adapters/claude/_meta/end_skill.yaml +0 -0
  173. {pathly_adapters-2.0.3 → pathly_adapters-2.3.0}/src/pathly_data/adapters/claude/_meta/explore_skill.yaml +0 -0
  174. {pathly_adapters-2.0.3 → pathly_adapters-2.3.0}/src/pathly_data/adapters/claude/_meta/go_skill.yaml +0 -0
  175. {pathly_adapters-2.0.3 → pathly_adapters-2.3.0}/src/pathly_data/adapters/claude/_meta/help_skill.yaml +0 -0
  176. {pathly_adapters-2.0.3 → pathly_adapters-2.3.0}/src/pathly_data/adapters/claude/_meta/install.yaml +0 -0
  177. {pathly_adapters-2.0.3 → pathly_adapters-2.3.0}/src/pathly_data/adapters/claude/_meta/lessons_skill.yaml +0 -0
  178. {pathly_adapters-2.0.3 → pathly_adapters-2.3.0}/src/pathly_data/adapters/claude/_meta/meet_skill.yaml +0 -0
  179. {pathly_adapters-2.0.3 → pathly_adapters-2.3.0}/src/pathly_data/adapters/claude/_meta/pause_skill.yaml +0 -0
  180. {pathly_adapters-2.0.3 → pathly_adapters-2.3.0}/src/pathly_data/adapters/claude/_meta/plan_skill.yaml +0 -0
  181. {pathly_adapters-2.0.3 → pathly_adapters-2.3.0}/src/pathly_data/adapters/claude/_meta/po_skill.yaml +0 -0
  182. {pathly_adapters-2.0.3 → pathly_adapters-2.3.0}/src/pathly_data/adapters/claude/_meta/prd-import_skill.yaml +0 -0
  183. {pathly_adapters-2.0.3 → pathly_adapters-2.3.0}/src/pathly_data/adapters/claude/_meta/retro_skill.yaml +0 -0
  184. {pathly_adapters-2.0.3 → pathly_adapters-2.3.0}/src/pathly_data/adapters/claude/_meta/review_skill.yaml +0 -0
  185. {pathly_adapters-2.0.3 → pathly_adapters-2.3.0}/src/pathly_data/adapters/claude/_meta/start_skill.yaml +0 -0
  186. {pathly_adapters-2.0.3 → pathly_adapters-2.3.0}/src/pathly_data/adapters/claude/_meta/storm_skill.yaml +0 -0
  187. {pathly_adapters-2.0.3 → pathly_adapters-2.3.0}/src/pathly_data/adapters/claude/_meta/test_skill.yaml +0 -0
  188. {pathly_adapters-2.0.3 → pathly_adapters-2.3.0}/src/pathly_data/adapters/claude/_meta/verify-state_skill.yaml +0 -0
  189. {pathly_adapters-2.0.3 → pathly_adapters-2.3.0}/src/pathly_data/adapters/codex/_meta/archive_skill.yaml +0 -0
  190. {pathly_adapters-2.0.3 → pathly_adapters-2.3.0}/src/pathly_data/adapters/codex/_meta/build_skill.yaml +0 -0
  191. {pathly_adapters-2.0.3 → pathly_adapters-2.3.0}/src/pathly_data/adapters/codex/_meta/builder.yaml +0 -0
  192. {pathly_adapters-2.0.3 → pathly_adapters-2.3.0}/src/pathly_data/adapters/codex/_meta/debug_skill.yaml +0 -0
  193. {pathly_adapters-2.0.3 → pathly_adapters-2.3.0}/src/pathly_data/adapters/codex/_meta/end_skill.yaml +0 -0
  194. {pathly_adapters-2.0.3 → pathly_adapters-2.3.0}/src/pathly_data/adapters/codex/_meta/explore_skill.yaml +0 -0
  195. {pathly_adapters-2.0.3 → pathly_adapters-2.3.0}/src/pathly_data/adapters/codex/_meta/go_skill.yaml +0 -0
  196. {pathly_adapters-2.0.3 → pathly_adapters-2.3.0}/src/pathly_data/adapters/codex/_meta/help_skill.yaml +0 -0
  197. {pathly_adapters-2.0.3 → pathly_adapters-2.3.0}/src/pathly_data/adapters/codex/_meta/lessons_skill.yaml +0 -0
  198. {pathly_adapters-2.0.3 → pathly_adapters-2.3.0}/src/pathly_data/adapters/codex/_meta/meet_skill.yaml +0 -0
  199. {pathly_adapters-2.0.3 → pathly_adapters-2.3.0}/src/pathly_data/adapters/codex/_meta/pause_skill.yaml +0 -0
  200. {pathly_adapters-2.0.3 → pathly_adapters-2.3.0}/src/pathly_data/adapters/codex/_meta/plan_skill.yaml +0 -0
  201. {pathly_adapters-2.0.3 → pathly_adapters-2.3.0}/src/pathly_data/adapters/codex/_meta/po_skill.yaml +0 -0
  202. {pathly_adapters-2.0.3 → pathly_adapters-2.3.0}/src/pathly_data/adapters/codex/_meta/prd-import_skill.yaml +0 -0
  203. {pathly_adapters-2.0.3 → pathly_adapters-2.3.0}/src/pathly_data/adapters/codex/_meta/retro_skill.yaml +0 -0
  204. {pathly_adapters-2.0.3 → pathly_adapters-2.3.0}/src/pathly_data/adapters/codex/_meta/review_skill.yaml +0 -0
  205. {pathly_adapters-2.0.3 → pathly_adapters-2.3.0}/src/pathly_data/adapters/codex/_meta/start_skill.yaml +0 -0
  206. {pathly_adapters-2.0.3 → pathly_adapters-2.3.0}/src/pathly_data/adapters/codex/_meta/storm_skill.yaml +0 -0
  207. {pathly_adapters-2.0.3 → pathly_adapters-2.3.0}/src/pathly_data/adapters/codex/_meta/test_skill.yaml +0 -0
  208. {pathly_adapters-2.0.3 → pathly_adapters-2.3.0}/src/pathly_data/adapters/codex/_meta/verify-state_skill.yaml +0 -0
  209. {pathly_adapters-2.0.3 → pathly_adapters-2.3.0}/src/pathly_data/adapters/copilot/README.md +0 -0
  210. {pathly_adapters-2.0.3 → pathly_adapters-2.3.0}/src/pathly_data/adapters/copilot/_meta/archive_skill.yaml +0 -0
  211. {pathly_adapters-2.0.3 → pathly_adapters-2.3.0}/src/pathly_data/adapters/copilot/_meta/build_skill.yaml +0 -0
  212. {pathly_adapters-2.0.3 → pathly_adapters-2.3.0}/src/pathly_data/adapters/copilot/_meta/debug_skill.yaml +0 -0
  213. {pathly_adapters-2.0.3 → pathly_adapters-2.3.0}/src/pathly_data/adapters/copilot/_meta/end_skill.yaml +0 -0
  214. {pathly_adapters-2.0.3 → pathly_adapters-2.3.0}/src/pathly_data/adapters/copilot/_meta/explore_skill.yaml +0 -0
  215. {pathly_adapters-2.0.3 → pathly_adapters-2.3.0}/src/pathly_data/adapters/copilot/_meta/go_skill.yaml +0 -0
  216. {pathly_adapters-2.0.3 → pathly_adapters-2.3.0}/src/pathly_data/adapters/copilot/_meta/help_skill.yaml +0 -0
  217. {pathly_adapters-2.0.3 → pathly_adapters-2.3.0}/src/pathly_data/adapters/copilot/_meta/lessons_skill.yaml +0 -0
  218. {pathly_adapters-2.0.3 → pathly_adapters-2.3.0}/src/pathly_data/adapters/copilot/_meta/meet_skill.yaml +0 -0
  219. {pathly_adapters-2.0.3 → pathly_adapters-2.3.0}/src/pathly_data/adapters/copilot/_meta/pause_skill.yaml +0 -0
  220. {pathly_adapters-2.0.3 → pathly_adapters-2.3.0}/src/pathly_data/adapters/copilot/_meta/plan_skill.yaml +0 -0
  221. {pathly_adapters-2.0.3 → pathly_adapters-2.3.0}/src/pathly_data/adapters/copilot/_meta/po_skill.yaml +0 -0
  222. {pathly_adapters-2.0.3 → pathly_adapters-2.3.0}/src/pathly_data/adapters/copilot/_meta/prd-import_skill.yaml +0 -0
  223. {pathly_adapters-2.0.3 → pathly_adapters-2.3.0}/src/pathly_data/adapters/copilot/_meta/retro_skill.yaml +0 -0
  224. {pathly_adapters-2.0.3 → pathly_adapters-2.3.0}/src/pathly_data/adapters/copilot/_meta/review_skill.yaml +0 -0
  225. {pathly_adapters-2.0.3 → pathly_adapters-2.3.0}/src/pathly_data/adapters/copilot/_meta/start_skill.yaml +0 -0
  226. {pathly_adapters-2.0.3 → pathly_adapters-2.3.0}/src/pathly_data/adapters/copilot/_meta/storm_skill.yaml +0 -0
  227. {pathly_adapters-2.0.3 → pathly_adapters-2.3.0}/src/pathly_data/adapters/copilot/_meta/test_skill.yaml +0 -0
  228. {pathly_adapters-2.0.3 → pathly_adapters-2.3.0}/src/pathly_data/adapters/copilot/_meta/verify-state_skill.yaml +0 -0
  229. {pathly_adapters-2.0.3 → pathly_adapters-2.3.0}/src/pathly_data/core/README.md +0 -0
  230. {pathly_adapters-2.0.3 → pathly_adapters-2.3.0}/src/pathly_data/core/agents/README_routing.md +0 -0
  231. {pathly_adapters-2.0.3 → pathly_adapters-2.3.0}/src/pathly_data/core/agents/architect.md +0 -0
  232. {pathly_adapters-2.0.3 → pathly_adapters-2.3.0}/src/pathly_data/core/agents/director.md +0 -0
  233. {pathly_adapters-2.0.3 → pathly_adapters-2.3.0}/src/pathly_data/core/agents/quick.md +0 -0
  234. {pathly_adapters-2.0.3 → pathly_adapters-2.3.0}/src/pathly_data/core/agents/reviewer.md +0 -0
  235. {pathly_adapters-2.0.3 → pathly_adapters-2.3.0}/src/pathly_data/core/agents/scout.md +0 -0
  236. {pathly_adapters-2.0.3 → pathly_adapters-2.3.0}/src/pathly_data/core/agents/web-researcher.md +0 -0
  237. {pathly_adapters-2.0.3 → pathly_adapters-2.3.0}/src/pathly_data/core/skills/end.md +0 -0
  238. {pathly_adapters-2.0.3 → pathly_adapters-2.3.0}/src/pathly_data/core/skills/lessons.md +0 -0
  239. {pathly_adapters-2.0.3 → pathly_adapters-2.3.0}/src/pathly_data/core/skills/retro.md +0 -0
  240. {pathly_adapters-2.0.3 → pathly_adapters-2.3.0}/src/pathly_data/core/skills/start.md +0 -0
  241. {pathly_adapters-2.0.3 → pathly_adapters-2.3.0}/src/pathly_data/core/skills/storm.md +0 -0
  242. {pathly_adapters-2.0.3 → pathly_adapters-2.3.0}/src/pathly_data/core/skills/verify-state.md +0 -0
  243. {pathly_adapters-2.0.3 → pathly_adapters-2.3.0}/src/pathly_data/core/templates/README.md +0 -0
  244. {pathly_adapters-2.0.3 → pathly_adapters-2.3.0}/src/pathly_data/core/templates/pipeline-walkthrough/01-PIPELINE-FLOW.md +0 -0
  245. {pathly_adapters-2.0.3 → pathly_adapters-2.3.0}/src/pathly_data/core/templates/pipeline-walkthrough/02-TOKEN-USAGE.md +0 -0
  246. {pathly_adapters-2.0.3 → pathly_adapters-2.3.0}/src/pathly_data/core/templates/pipeline-walkthrough/03-ARTIFACT-MAP.md +0 -0
  247. {pathly_adapters-2.0.3 → pathly_adapters-2.3.0}/src/pathly_data/core/templates/pipeline-walkthrough/README.md +0 -0
  248. {pathly_adapters-2.0.3 → pathly_adapters-2.3.0}/src/pathly_data/core/templates/plan/ARCHITECTURE_PROPOSAL.template.md +0 -0
  249. {pathly_adapters-2.0.3 → pathly_adapters-2.3.0}/src/pathly_data/core/templates/plan/CONVERSATION_PROMPTS.template.md +0 -0
  250. {pathly_adapters-2.0.3 → pathly_adapters-2.3.0}/src/pathly_data/core/templates/plan/EDGE_CASES.template.md +0 -0
  251. {pathly_adapters-2.0.3 → pathly_adapters-2.3.0}/src/pathly_data/core/templates/plan/FLOW_DIAGRAM.template.md +0 -0
  252. {pathly_adapters-2.0.3 → pathly_adapters-2.3.0}/src/pathly_data/core/templates/plan/HAPPY_FLOW.template.md +0 -0
  253. {pathly_adapters-2.0.3 → pathly_adapters-2.3.0}/src/pathly_data/core/templates/plan/IMPLEMENTATION_PLAN.template.md +0 -0
  254. {pathly_adapters-2.0.3 → pathly_adapters-2.3.0}/src/pathly_data/core/templates/plan/MERMAID_DIAGRAM.template.md +0 -0
  255. {pathly_adapters-2.0.3 → pathly_adapters-2.3.0}/src/pathly_data/core/templates/plan/PROGRESS.template.md +0 -0
  256. {pathly_adapters-2.0.3 → pathly_adapters-2.3.0}/src/pathly_data/core/templates/plan/USER_STORIES.template.md +0 -0
  257. {pathly_adapters-2.0.3 → pathly_adapters-2.3.0}/src/pathly_telemetry/server.py +0 -0
  258. {pathly_adapters-2.0.3 → pathly_adapters-2.3.0}/tests/test_mcp_config.py +0 -0
  259. {pathly_adapters-2.0.3 → pathly_adapters-2.3.0}/tests/test_stitch.py +0 -0
  260. {pathly_adapters-2.0.3 → pathly_adapters-2.3.0}/tests/test_stitch_skill.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pathly-adapters
3
- Version: 2.0.3
3
+ Version: 2.3.0
4
4
  Summary: Pathly adapter installer — stitches and deploys agent files to AI host tools.
5
5
  Requires-Python: >=3.11
6
6
  Requires-Dist: pyyaml>=6.0
@@ -8,3 +8,4 @@ Provides-Extra: dev
8
8
  Requires-Dist: pytest>=8; extra == "dev"
9
9
  Requires-Dist: build; extra == "dev"
10
10
  Requires-Dist: twine; extra == "dev"
11
+ Requires-Dist: jsonschema>=4; extra == "dev"
@@ -37,7 +37,9 @@ Then open Claude Code in your project directory and start:
37
37
  /pathly end ← retro + archive
38
38
  ```
39
39
 
40
- All commands go through `/pathly`. See `/pathly help` for the full command list.
40
+ All commands go through `/pathly`. See [docs/FLOW_DIAGRAM.md](docs/FLOW_DIAGRAM.md) for the full command reference.
41
+
42
+ > **Tip:** `/start` and `/pathly start` are equivalent. `/pathly` dispatches to the same skill; direct invocation skips the dispatcher.
41
43
 
42
44
  ## All commands
43
45
 
@@ -51,6 +53,8 @@ pathly-setup copilot --apply # install for Copilot / VS Code only
51
53
  pathly-setup --repair # overwrite Pathly-owned files
52
54
  pathly-setup --force # overwrite all files, even non-Pathly-owned
53
55
  pathly-setup --uninstall # remove all Pathly-owned files
56
+ pathly-events summary <feature> # print token/cost table for a pipeline run
57
+ pathly-state <feature> # print current FSM state for a feature
54
58
  ```
55
59
 
56
60
  `--dry-run` never writes. `--apply` is required for any writes.
@@ -59,15 +63,16 @@ pathly-setup --uninstall # remove all Pathly-owned files
59
63
 
60
64
  | Host | Detected by | Installed locations |
61
65
  |------|-------------|---------------------|
62
- | `claude` | `~/.claude/` directory exists | `~/.claude/agents/` + `~/.claude/skills/` |
63
- | `codex` | Codex config directory exists | `~/.codex/agents/` + `~/.codex/skills/` |
64
- | `copilot` | VS Code + Copilot detected | VS Code agents folder |
66
+ | `claude` | `~/.claude/` directory exists | `~/.claude/agents/` (behavioral contracts)<br>`~/.claude/skills/` (skill folders) |
67
+ | `codex` | Codex config directory exists | `~/.codex/agents/` + `~/.codex/skills/` + local plugin marketplace |
68
+ | `copilot` | VS Code + Copilot detected | `~/.vscode/extensions/pathly/agents/`<br>`~/.vscode/extensions/pathly/skills/` |
65
69
 
66
70
  ## How It Works
67
71
 
68
72
  1. **Detect** — scans for installed hosts on the current machine.
69
- 2. **Stitch** — combines `core/agents/` and `core/skills/` content with adapter-specific `_meta/*.yaml` to produce deployable agent and skill files (frontmatter + body + spawn section).
73
+ 2. **Stitch** — combines `core/agents/` and `core/skills/` content with adapter-specific `_meta/<name>.yaml` to produce deployable agent and skill files (frontmatter + body + spawn section).
70
74
  3. **Materialize** — writes stitched files to the host config location. A manifest tracks Pathly-owned files; `--repair` overwrites owned files, `--force` overwrites everything. Install is atomic — if anything fails, already-written files are rolled back.
75
+ 4. **Register Codex plugin** - for Codex installs, writes `~/.codex/pathly-marketplace`, enables `pathly@pathly-local`, and refreshes the marketplace through the Codex CLI when available.
71
76
 
72
77
  ## Development setup
73
78
 
@@ -119,3 +124,5 @@ Stable (1.0.0). Core install path (`--dry-run`, `--apply`, `--uninstall`) is ver
119
124
  - **Hook path validation requires Python 3.9+** — hook scripts use `Path.is_relative_to()`, introduced in Python 3.9. The project already requires Python 3.11+, so this is always satisfied.
120
125
 
121
126
  - **Hooks require `PATHLY_PROJECT_ROOT`** — hook scripts (`classify_feedback.py`, `inject_feedback_ttl.py`) read the `PATHLY_PROJECT_ROOT` environment variable to locate the active project's `plans/` directory. If this variable is not set, hooks exit immediately without performing any action.
127
+
128
+ - **Hook parity gap** — Pathly hooks run automatically only under Claude Code. Codex and Copilot VS Code require manual install; see [Hook surface coverage](docs/SECURITY.md#hook-surface-coverage).
@@ -4,17 +4,19 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "pathly-adapters"
7
- version = "2.0.3"
7
+ version = "2.3.0"
8
8
  description = "Pathly adapter installer — stitches and deploys agent files to AI host tools."
9
9
  requires-python = ">=3.11"
10
10
  dependencies = ["pyyaml>=6.0"]
11
11
 
12
12
  [project.optional-dependencies]
13
- dev = ["pytest>=8", "build", "twine"]
13
+ dev = ["pytest>=8", "build", "twine", "jsonschema>=4"]
14
14
 
15
15
  [project.scripts]
16
16
  pathly-setup = "install_cli.__main__:main"
17
17
  pathly-tokens = "pathly_telemetry.report:main"
18
+ pathly-events = "pathly_orchestrator.eventlog:_cli"
19
+ pathly-state = "pathly_orchestrator.eventlog:_state_cli"
18
20
 
19
21
  [tool.pytest.ini_options]
20
22
  testpaths = ["tests"]
@@ -23,7 +25,7 @@ addopts = ["-p", "no:cacheprovider"]
23
25
 
24
26
  [tool.setuptools.packages.find]
25
27
  where = ["src"]
26
- include = ["install_cli*", "pathly_telemetry*", "pathly_data*"]
28
+ include = ["install_cli*", "pathly_telemetry*", "pathly_data*", "pathly_orchestrator*", "pathly_hooks*"]
27
29
 
28
30
  [tool.setuptools.package-data]
29
31
  "pathly_data" = [
@@ -1,122 +1,170 @@
1
- """Install/remove Pathly's Codex local marketplace registration."""
2
- from __future__ import annotations
3
-
4
- import json
5
- import re
6
- import shutil
7
- import sys
8
- from pathlib import Path
9
-
10
- MARKETPLACE_NAME = "pathly-local"
11
- PLUGIN_NAME = "pathly"
12
-
13
- _CODEX_CONFIG = Path.home() / ".codex" / "config.toml"
14
- _MARKETPLACE_ROOT = Path.home() / ".codex" / "pathly-marketplace"
15
-
16
-
17
- def install_codex_plugin(
18
- plugin_files: dict[str, str],
19
- *,
20
- dry_run: bool = False,
21
- config_path: Path | None = None,
22
- marketplace_root: Path | None = None,
23
- ) -> None:
24
- """Create a real local marketplace and enable the Pathly plugin."""
25
- config_path = config_path or _CODEX_CONFIG
26
- marketplace_root = marketplace_root or _MARKETPLACE_ROOT
27
-
28
- if dry_run:
29
- print(f" [dry-run] Would write Codex marketplace to {marketplace_root}")
30
- print(f" [dry-run] Would enable plugin '{PLUGIN_NAME}@{MARKETPLACE_NAME}' in {config_path}")
31
- return
32
-
33
- plugin_root = marketplace_root / "plugins" / PLUGIN_NAME
34
- if plugin_root.exists():
35
- shutil.rmtree(plugin_root)
36
- plugin_root.mkdir(parents=True, exist_ok=True)
37
-
38
- for name, content in sorted(plugin_files.items()):
39
- target = plugin_root / name
40
- if not target.resolve().is_relative_to(plugin_root.resolve()):
41
- raise ValueError(f"Path traversal detected in plugin file: {name!r}")
42
- target.parent.mkdir(parents=True, exist_ok=True)
43
- target.write_text(content, encoding="utf-8")
44
-
45
- _write_marketplace_json(marketplace_root)
46
- _enable_in_codex_config(config_path, marketplace_root)
47
- print(f"[codex] Registered local plugin marketplace at {marketplace_root}")
48
-
49
-
50
- def uninstall_codex_plugin(
51
- *,
52
- dry_run: bool = False,
53
- config_path: Path | None = None,
54
- marketplace_root: Path | None = None,
55
- ) -> None:
56
- config_path = config_path or _CODEX_CONFIG
57
- marketplace_root = marketplace_root or _MARKETPLACE_ROOT
58
-
59
- if dry_run:
60
- print(f" [dry-run] Would remove plugin '{PLUGIN_NAME}@{MARKETPLACE_NAME}' from {config_path}")
61
- print(f" [dry-run] Would remove Codex marketplace at {marketplace_root}")
62
- return
63
-
64
- _disable_in_codex_config(config_path)
65
- if marketplace_root.exists():
66
- shutil.rmtree(marketplace_root)
67
- print(f"[codex] Removed local plugin marketplace at {marketplace_root}")
68
-
69
-
70
- def _write_marketplace_json(root: Path) -> None:
71
- path = root / ".agents" / "plugins" / "marketplace.json"
72
- path.parent.mkdir(parents=True, exist_ok=True)
73
- data = {
74
- "name": MARKETPLACE_NAME,
75
- "interface": {"displayName": "Pathly Local"},
76
- "plugins": [
77
- {
78
- "name": PLUGIN_NAME,
79
- "source": {"source": "local", "path": f"./plugins/{PLUGIN_NAME}"},
80
- "policy": {"installation": "AVAILABLE", "authentication": "ON_INSTALL"},
81
- "category": "Developer Tools",
82
- }
83
- ],
84
- }
85
- path.write_text(json.dumps(data, indent=2), encoding="utf-8")
86
-
87
-
88
- def _enable_in_codex_config(path: Path, marketplace_root: Path) -> None:
89
- content = _read_config(path)
90
- content = _remove_pathly_blocks(content)
91
- block = (
92
- f"\n[marketplaces.{MARKETPLACE_NAME}]\n"
93
- 'last_updated = "1970-01-01T00:00:00Z"\n'
94
- 'source_type = "local"\n'
95
- f"source = '{marketplace_root}'\n"
96
- f'[plugins."{PLUGIN_NAME}@{MARKETPLACE_NAME}"]\n'
97
- "enabled = true\n"
98
- )
99
- path.parent.mkdir(parents=True, exist_ok=True)
100
- path.write_text(content.rstrip() + "\n" + block, encoding="utf-8")
101
-
102
-
103
- def _disable_in_codex_config(path: Path) -> None:
104
- content = _read_config(path)
105
- cleaned = _remove_pathly_blocks(content)
106
- if cleaned != content:
107
- path.write_text(cleaned.rstrip() + "\n", encoding="utf-8")
108
-
109
-
110
- def _read_config(path: Path) -> str:
111
- if not path.exists():
112
- print(f" [warn] Codex config not found at {path}; creating it.", file=sys.stderr)
113
- return ""
114
- return path.read_text(encoding="utf-8")
115
-
116
-
117
- def _remove_pathly_blocks(content: str) -> str:
118
- marketplace = rf"\n?\[marketplaces\.{re.escape(MARKETPLACE_NAME)}\].*?(?=\n\[|\Z)"
119
- plugin = rf"\n?\[plugins\.\"{re.escape(PLUGIN_NAME)}@{re.escape(MARKETPLACE_NAME)}\"\].*?(?=\n\[|\Z)"
120
- content = re.sub(marketplace, "", content, flags=re.DOTALL)
121
- content = re.sub(plugin, "", content, flags=re.DOTALL)
122
- return content
1
+ """Install/remove Pathly's Codex local marketplace registration."""
2
+ from __future__ import annotations
3
+
4
+ import json
5
+ import re
6
+ import shutil
7
+ import subprocess
8
+ import sys
9
+ from pathlib import Path
10
+
11
+ MARKETPLACE_NAME = "pathly-local"
12
+ PLUGIN_NAME = "pathly"
13
+
14
+ _CODEX_CONFIG = Path.home() / ".codex" / "config.toml"
15
+ _MARKETPLACE_ROOT = Path.home() / ".codex" / "pathly-marketplace"
16
+
17
+
18
+ def install_codex_plugin(
19
+ plugin_files: dict[str, str],
20
+ *,
21
+ dry_run: bool = False,
22
+ config_path: Path | None = None,
23
+ marketplace_root: Path | None = None,
24
+ codex_command: str | None = None,
25
+ ) -> None:
26
+ """Create a real local marketplace and enable the Pathly plugin."""
27
+ config_path = config_path or _CODEX_CONFIG
28
+ marketplace_root = marketplace_root or _MARKETPLACE_ROOT
29
+
30
+ if dry_run:
31
+ print(f" [dry-run] Would write Codex marketplace to {marketplace_root}")
32
+ print(f" [dry-run] Would enable plugin '{PLUGIN_NAME}@{MARKETPLACE_NAME}' in {config_path}")
33
+ print(" [dry-run] Would refresh Codex local marketplace registration if the codex CLI is available")
34
+ return
35
+
36
+ using_default_paths = config_path == _CODEX_CONFIG and marketplace_root == _MARKETPLACE_ROOT
37
+ plugin_root = marketplace_root / "plugins" / PLUGIN_NAME
38
+ if plugin_root.exists():
39
+ shutil.rmtree(plugin_root)
40
+ plugin_root.mkdir(parents=True, exist_ok=True)
41
+
42
+ for name, content in sorted(plugin_files.items()):
43
+ target = plugin_root / name
44
+ if not target.resolve().is_relative_to(plugin_root.resolve()):
45
+ raise ValueError(f"Path traversal detected in plugin file: {name!r}")
46
+ target.parent.mkdir(parents=True, exist_ok=True)
47
+ target.write_text(content, encoding="utf-8")
48
+
49
+ _write_marketplace_json(marketplace_root)
50
+ refreshed = _refresh_codex_marketplace(
51
+ marketplace_root,
52
+ codex_command=codex_command,
53
+ discover_cli=using_default_paths,
54
+ )
55
+ if not refreshed:
56
+ _enable_in_codex_config(config_path, marketplace_root)
57
+ print(f"[codex] Registered local plugin marketplace at {marketplace_root}")
58
+ print('[codex] Restart Codex and start a new thread. Try: "Use Pathly help"')
59
+
60
+
61
+ def uninstall_codex_plugin(
62
+ *,
63
+ dry_run: bool = False,
64
+ config_path: Path | None = None,
65
+ marketplace_root: Path | None = None,
66
+ ) -> None:
67
+ config_path = config_path or _CODEX_CONFIG
68
+ marketplace_root = marketplace_root or _MARKETPLACE_ROOT
69
+
70
+ if dry_run:
71
+ print(f" [dry-run] Would remove plugin '{PLUGIN_NAME}@{MARKETPLACE_NAME}' from {config_path}")
72
+ print(f" [dry-run] Would remove Codex marketplace at {marketplace_root}")
73
+ return
74
+
75
+ _disable_in_codex_config(config_path)
76
+ if marketplace_root.exists():
77
+ shutil.rmtree(marketplace_root)
78
+ print(f"[codex] Removed local plugin marketplace at {marketplace_root}")
79
+
80
+
81
+ def _write_marketplace_json(root: Path) -> None:
82
+ path = root / ".agents" / "plugins" / "marketplace.json"
83
+ path.parent.mkdir(parents=True, exist_ok=True)
84
+ data = {
85
+ "name": MARKETPLACE_NAME,
86
+ "interface": {"displayName": "Pathly Local"},
87
+ "plugins": [
88
+ {
89
+ "name": PLUGIN_NAME,
90
+ "source": {"source": "local", "path": f"./plugins/{PLUGIN_NAME}"},
91
+ "policy": {"installation": "AVAILABLE", "authentication": "ON_INSTALL"},
92
+ "category": "Developer Tools",
93
+ }
94
+ ],
95
+ }
96
+ path.write_text(json.dumps(data, indent=2), encoding="utf-8")
97
+
98
+
99
+ def _refresh_codex_marketplace(
100
+ marketplace_root: Path,
101
+ *,
102
+ codex_command: str | None = None,
103
+ discover_cli: bool = True,
104
+ ) -> bool:
105
+ command = codex_command
106
+ if command is None and discover_cli:
107
+ command = shutil.which("codex")
108
+ if command is None:
109
+ print("[codex] Codex CLI not found; config.toml was updated directly.")
110
+ return False
111
+
112
+ remove = subprocess.run(
113
+ [command, "plugin", "marketplace", "remove", MARKETPLACE_NAME],
114
+ capture_output=True,
115
+ text=True,
116
+ timeout=60,
117
+ )
118
+ if remove.returncode != 0:
119
+ print(f"[codex] Marketplace remove skipped: {remove.stderr.strip() or remove.stdout.strip()}")
120
+
121
+ add = subprocess.run(
122
+ [command, "plugin", "marketplace", "add", str(marketplace_root)],
123
+ capture_output=True,
124
+ text=True,
125
+ timeout=60,
126
+ )
127
+ if add.returncode != 0:
128
+ print(f"[codex] Codex CLI marketplace refresh failed: {add.stderr.strip() or add.stdout.strip()}", file=sys.stderr)
129
+ print("[codex] Falling back to direct config.toml registration.", file=sys.stderr)
130
+ return False
131
+
132
+ print("[codex] Refreshed Codex local marketplace registration via codex CLI.")
133
+ return True
134
+
135
+
136
+ def _enable_in_codex_config(path: Path, marketplace_root: Path) -> None:
137
+ content = _read_config(path)
138
+ content = _remove_pathly_blocks(content)
139
+ block = (
140
+ f"\n[marketplaces.{MARKETPLACE_NAME}]\n"
141
+ 'last_updated = "1970-01-01T00:00:00Z"\n'
142
+ 'source_type = "local"\n'
143
+ f"source = '{marketplace_root}'\n"
144
+ f'[plugins."{PLUGIN_NAME}@{MARKETPLACE_NAME}"]\n'
145
+ "enabled = true\n"
146
+ )
147
+ path.parent.mkdir(parents=True, exist_ok=True)
148
+ path.write_text(content.rstrip() + "\n" + block, encoding="utf-8")
149
+
150
+
151
+ def _disable_in_codex_config(path: Path) -> None:
152
+ content = _read_config(path)
153
+ cleaned = _remove_pathly_blocks(content)
154
+ if cleaned != content:
155
+ path.write_text(cleaned.rstrip() + "\n", encoding="utf-8")
156
+
157
+
158
+ def _read_config(path: Path) -> str:
159
+ if not path.exists():
160
+ print(f" [warn] Codex config not found at {path}; creating it.", file=sys.stderr)
161
+ return ""
162
+ return path.read_text(encoding="utf-8")
163
+
164
+
165
+ def _remove_pathly_blocks(content: str) -> str:
166
+ marketplace = rf"\n?\[marketplaces\.{re.escape(MARKETPLACE_NAME)}\].*?(?=\n\[|\Z)"
167
+ plugin = rf"\n?\[plugins\.\"{re.escape(PLUGIN_NAME)}@{re.escape(MARKETPLACE_NAME)}\"\].*?(?=\n\[|\Z)"
168
+ content = re.sub(marketplace, "", content, flags=re.DOTALL)
169
+ content = re.sub(plugin, "", content, flags=re.DOTALL)
170
+ return content
@@ -1,21 +1,21 @@
1
- from pathlib import Path
2
-
3
- _HOST_MARKERS: dict[str, list[Path]] = {
4
- "claude": [
5
- Path.home() / ".claude",
6
- ],
7
- "codex": [
8
- Path.home() / ".codex",
9
- Path.home() / ".openai-codex",
10
- ],
11
- "copilot": [
12
- Path.home() / "AppData" / "Roaming" / "Code", # Windows
13
- Path.home() / ".config" / "Code", # Linux
14
- Path.home() / "Library" / "Application Support" / "Code", # macOS
15
- Path.home() / ".vscode",
16
- ],
17
- }
18
-
19
-
20
- def detect_hosts() -> list[str]:
21
- return [host for host, paths in _HOST_MARKERS.items() if any(p.exists() for p in paths)]
1
+ from pathlib import Path
2
+
3
+ _HOST_MARKERS: dict[str, list[Path]] = {
4
+ "claude": [
5
+ Path.home() / ".claude",
6
+ ],
7
+ "codex": [
8
+ Path.home() / ".codex",
9
+ Path.home() / ".openai-codex",
10
+ ],
11
+ "copilot": [
12
+ Path.home() / "AppData" / "Roaming" / "Code", # Windows
13
+ Path.home() / ".config" / "Code", # Linux
14
+ Path.home() / "Library" / "Application Support" / "Code", # macOS
15
+ Path.home() / ".vscode",
16
+ ],
17
+ }
18
+
19
+
20
+ def detect_hosts() -> list[str]:
21
+ return [host for host, paths in _HOST_MARKERS.items() if any(p.exists() for p in paths)]