claude-dev-env 2.15.0 → 2.16.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 (681) hide show
  1. package/.agents/agents/.claude/CLAUDE.md +1 -0
  2. package/{agents → .agents/agents}/AGENTS.md +2 -2
  3. package/{agents → .agents/agents}/test_agent_frontmatter.py +1 -1
  4. package/.agents/skills/.claude/CLAUDE.md +1 -0
  5. package/{skills → .agents/skills}/AGENTS.md +2 -2
  6. package/.agents/skills/_shared/.claude/CLAUDE.md +1 -0
  7. package/{skills → .agents/skills}/_shared/AGENTS.md +2 -2
  8. package/.agents/skills/_shared/advisor/.claude/CLAUDE.md +1 -0
  9. package/.agents/skills/_shared/pr-loop/.claude/CLAUDE.md +1 -0
  10. package/.agents/skills/_shared/pr-loop/prompts/.claude/CLAUDE.md +1 -0
  11. package/.agents/skills/_shared/pr-loop/scripts/.claude/CLAUDE.md +1 -0
  12. package/.agents/skills/_shared/pr-loop/scripts/skills_pr_loop_constants/.claude/CLAUDE.md +1 -0
  13. package/{skills → .agents/skills}/_shared/pr-loop/scripts/skills_pr_loop_constants/audit_category_schema_constants.py +6 -1
  14. package/{skills → .agents/skills}/_shared/pr-loop/scripts/test_build_audit_prompt.py +9 -3
  15. package/{skills → .agents/skills}/_shared/pr-loop/scripts/write_audit_outcomes.py +1 -1
  16. package/{skills → .agents/skills}/_shared/pr-loop/scripts/write_fix_outcomes.py +1 -1
  17. package/.agents/skills/anthropic-plan/.claude/CLAUDE.md +1 -0
  18. package/{skills → .agents/skills}/anthropic-plan/AGENTS.md +1 -1
  19. package/.agents/skills/anthropic-plan/scripts/.claude/CLAUDE.md +1 -0
  20. package/.agents/skills/anthropic-plan/scripts/anthropic_plan_scripts_constants/.claude/CLAUDE.md +1 -0
  21. package/.agents/skills/anthropic-plan/templates/.claude/CLAUDE.md +1 -0
  22. package/{skills → .agents/skills}/anthropic-plan/test_skill_contract.py +4 -4
  23. package/.agents/skills/anthropic-plan/workflow/.claude/CLAUDE.md +1 -0
  24. package/.agents/skills/auditing-claude-config/.claude/CLAUDE.md +1 -0
  25. package/.agents/skills/autoconverge/.claude/CLAUDE.md +1 -0
  26. package/.agents/skills/autoconverge/reference/.claude/CLAUDE.md +1 -0
  27. package/.agents/skills/autoconverge/workflow/.claude/CLAUDE.md +1 -0
  28. package/.agents/skills/autoconverge/workflow/autoconverge_report_constants/.claude/CLAUDE.md +1 -0
  29. package/.agents/skills/bugteam/.claude/CLAUDE.md +1 -0
  30. package/.agents/skills/bugteam/reference/.claude/CLAUDE.md +1 -0
  31. package/.agents/skills/bugteam/reference/obstacles/.claude/CLAUDE.md +1 -0
  32. package/.agents/skills/bugteam/scripts/.claude/CLAUDE.md +1 -0
  33. package/{skills → .agents/skills}/bugteam/scripts/bugteam_code_rules_gate.py +11 -1
  34. package/{skills → .agents/skills}/bugteam/scripts/bugteam_fix_hookspath.py +11 -1
  35. package/{skills → .agents/skills}/bugteam/scripts/bugteam_preflight.py +11 -1
  36. package/.agents/skills/bugteam/scripts/bugteam_scripts_constants/.claude/CLAUDE.md +1 -0
  37. package/{skills → .agents/skills}/bugteam/scripts/reflow_skill_md.py +3 -3
  38. package/.agents/skills/codex-review/.claude/CLAUDE.md +1 -0
  39. package/.agents/skills/codex-review/reference/.claude/CLAUDE.md +1 -0
  40. package/.agents/skills/codex-review/scripts/codex_review_scripts_constants/.claude/CLAUDE.md +1 -0
  41. package/{skills → .agents/skills}/codex-review/scripts/codex_usage_probe.py +11 -1
  42. package/{skills → .agents/skills}/codex-review/scripts/run_codex_review.py +11 -1
  43. package/{skills → .agents/skills}/codex-review/test_skill_scaffold.py +4 -4
  44. package/.agents/skills/copilot-review/.claude/CLAUDE.md +1 -0
  45. package/{skills → .agents/skills}/e-code-review/reference/effort-evaluation.md +1 -1
  46. package/.agents/skills/everything-search/.claude/CLAUDE.md +1 -0
  47. package/.agents/skills/fresh-branch/.claude/CLAUDE.md +1 -0
  48. package/.agents/skills/grok-spawn/.claude/CLAUDE.md +1 -0
  49. package/{skills → .agents/skills}/grokify/evals/README.md +1 -1
  50. package/.agents/skills/pr-converge/.claude/CLAUDE.md +1 -0
  51. package/.agents/skills/pr-converge/pr_converge_skill_constants/.claude/CLAUDE.md +1 -0
  52. package/{skills → .agents/skills}/pr-converge/pr_converge_skill_constants/AGENTS.md +1 -1
  53. package/{skills → .agents/skills}/pr-converge/pr_converge_skill_constants/constants.py +1 -1
  54. package/.agents/skills/pr-converge/reference/.claude/CLAUDE.md +1 -0
  55. package/.agents/skills/pr-converge/reference/obstacles/.claude/CLAUDE.md +1 -0
  56. package/.agents/skills/pr-converge/scripts/.claude/CLAUDE.md +1 -0
  57. package/{skills → .agents/skills}/pr-converge/scripts/_pr_converge_path_setup.py +17 -2
  58. package/.agents/skills/pr-converge/scripts/pr_converge_scripts_constants/.claude/CLAUDE.md +1 -0
  59. package/{skills → .agents/skills}/pr-converge/scripts/reflow_skill_md.py +2 -2
  60. package/{skills → .agents/skills}/pr-converge/scripts/test__pr_converge_path_setup.py +7 -4
  61. package/.agents/skills/pr-converge/workflows/.claude/CLAUDE.md +1 -0
  62. package/{skills → .agents/skills}/prototype/scripts/test_probe_sandbox_safety.py +1 -1
  63. package/.agents/skills/rebase/.claude/CLAUDE.md +1 -0
  64. package/.agents/skills/recall/.claude/CLAUDE.md +1 -0
  65. package/.agents/skills/remember/.claude/CLAUDE.md +1 -0
  66. package/.agents/skills/run-claude-dev-env/SKILL.md +84 -0
  67. package/.agents/skills/run-claude-dev-env/driver.mjs +239 -0
  68. package/.agents/skills/session-log/.claude/CLAUDE.md +1 -0
  69. package/.agents/skills/session-tidy/.claude/CLAUDE.md +1 -0
  70. package/.agents/skills/skill-builder/.claude/CLAUDE.md +1 -0
  71. package/.agents/skills/skill-builder/references/.claude/CLAUDE.md +1 -0
  72. package/{skills → .agents/skills}/skill-builder/references/deterministic-elements.md +1 -1
  73. package/.agents/skills/skill-builder/templates/.claude/CLAUDE.md +1 -0
  74. package/.agents/skills/skill-builder/workflows/.claude/CLAUDE.md +1 -0
  75. package/{skills → .agents/skills}/split-pr/reference/proposal-format.md +1 -1
  76. package/.agents/skills/task-build/.claude/CLAUDE.md +1 -0
  77. package/.agents/skills/update/.claude/CLAUDE.md +1 -0
  78. package/.claude/CLAUDE.md +1 -0
  79. package/_shared/advisor/reference/sol-rung.md +1 -1
  80. package/_shared/advisor/scripts/tests/test_codex_sol_advisor.py +1 -1
  81. package/_shared/advisor/scripts/tier_model_ids.py +6 -2
  82. package/_shared/pr-loop/code-rules-gate.md +1 -1
  83. package/bin/AGENTS.md +17 -12
  84. package/bin/ever-shipped-skills.mjs +5 -2
  85. package/bin/install-constants.mjs +31 -6
  86. package/bin/install-plan.mjs +6 -1
  87. package/bin/install.agents-home.test.mjs +186 -0
  88. package/bin/install.mjs +120 -47
  89. package/bin/install.plan.test.mjs +1 -0
  90. package/bin/install.profile-root.test.mjs +53 -0
  91. package/bin/install.test.mjs +51 -8
  92. package/bin/publish-directory-pointer.mjs +175 -0
  93. package/bin/publish-directory-pointer.test.mjs +129 -0
  94. package/bin/resolve-install-root.mjs +59 -4
  95. package/bin/resolve-package-managed-directory.mjs +29 -0
  96. package/bin/resolve-package-managed-directory.test.mjs +97 -0
  97. package/hooks/blocking/hedging_language_blocker.py +1 -0
  98. package/hooks/blocking/orchestrator_refresh_reschedule_gate.py +10 -6
  99. package/hooks/blocking/test_code_rules_command_dispatch.py +1 -1
  100. package/hooks/blocking/test_code_rules_enforcer_magic_slice_bounds.py +1 -1
  101. package/hooks/blocking/test_code_rules_enforcer_split_annotations_length.py +1 -1
  102. package/hooks/blocking/test_code_rules_js_conventions.py +1 -1
  103. package/hooks/blocking/test_code_rules_js_resume_task_enumeration.py +1 -1
  104. package/hooks/blocking/test_code_rules_js_returns_object_schemaless.py +1 -1
  105. package/hooks/blocking/test_code_rules_js_sibling_return_object_key_drift.py +1 -1
  106. package/hooks/blocking/test_duplicate_rmtree_helper_blocker.py +1 -1
  107. package/hooks/blocking/test_fable_spawn_gate.py +1 -1
  108. package/hooks/blocking/test_orchestrator_refresh_reschedule_gate.py +1 -1
  109. package/hooks/hooks_constants/orchestrator_refresh_reschedule_gate_constants.py +9 -0
  110. package/installable-surfaces.manifest.json +2 -3
  111. package/package.json +4 -5
  112. package/scripts/AGENTS.md +0 -7
  113. package/scripts/active_capability_references.py +38 -8
  114. package/scripts/claude_chain_runner.py +49 -2
  115. package/scripts/claude_chain_usage.py +2 -0
  116. package/scripts/codex_compat_watcher.py +1 -1
  117. package/scripts/dev_env_scripts_constants/active_capability_constants.py +5 -2
  118. package/scripts/dev_env_scripts_constants/claude_chain_usage_constants.py +4 -1
  119. package/scripts/invoke_code_review.py +48 -51
  120. package/scripts/resolve_worker_spawn.py +42 -47
  121. package/scripts/test_claude_chain_runner.py +28 -0
  122. package/scripts/test_dispatcher_profile_import.py +184 -0
  123. package/scripts/test_resolve_worker_spawn.py +119 -1
  124. package/scripts/test_validate_instruction_pairs.py +30 -0
  125. package/scripts/test_verify_installable_package.py +2 -1
  126. package/scripts/tests/test_codex_compat_watcher.py +5 -5
  127. package/CLAUDE.md +0 -1
  128. package/agents/CLAUDE.md +0 -1
  129. package/scripts/profile-isolation-launchers/config/mcp-bundles.json +0 -25
  130. package/scripts/profile-isolation-launchers/config/profile-isolation-constants.mjs +0 -60
  131. package/scripts/profile-isolation-launchers/config/profiles.manifest.json +0 -54
  132. package/scripts/profile-isolation-launchers/config/shared-allowlist.json +0 -64
  133. package/scripts/profile-isolation-launchers/launcher-runtime.mjs +0 -180
  134. package/scripts/profile-isolation-launchers/lib/profile-manifest.mjs +0 -288
  135. package/scripts/profile-isolation-launchers/mcp-bundles.mjs +0 -275
  136. package/scripts/profile-isolation-launchers/profile-isolation-contract.test.mjs +0 -221
  137. package/scripts/profile-isolation-launchers/tests/launcher-runtime.test.mjs +0 -108
  138. package/scripts/profile-isolation-launchers/tests/mcp-bundles.test.mjs +0 -147
  139. package/scripts/profile-isolation-launchers/tests/shortcut-contract.test.ps1 +0 -102
  140. package/scripts/profile-isolation-launchers/tests/version-compatibility.test.mjs +0 -210
  141. package/scripts/profile-isolation-launchers/version-compatibility.mjs +0 -299
  142. package/scripts/profile-isolation-launchers/windows/shortcut-inventory.ps1 +0 -127
  143. package/scripts/profile-isolation-launchers/windows/shortcut-manifest.json +0 -51
  144. package/scripts/profile-isolation-launchers/windows/shortcut-reconcile.ps1 +0 -77
  145. package/skills/CLAUDE.md +0 -1
  146. package/skills/_shared/CLAUDE.md +0 -1
  147. package/skills/_shared/advisor/CLAUDE.md +0 -1
  148. package/skills/_shared/pr-loop/CLAUDE.md +0 -1
  149. package/skills/_shared/pr-loop/prompts/CLAUDE.md +0 -1
  150. package/skills/_shared/pr-loop/scripts/CLAUDE.md +0 -1
  151. package/skills/_shared/pr-loop/scripts/skills_pr_loop_constants/CLAUDE.md +0 -1
  152. package/skills/anthropic-plan/CLAUDE.md +0 -1
  153. package/skills/anthropic-plan/scripts/CLAUDE.md +0 -1
  154. package/skills/anthropic-plan/scripts/anthropic_plan_scripts_constants/CLAUDE.md +0 -1
  155. package/skills/anthropic-plan/templates/CLAUDE.md +0 -1
  156. package/skills/anthropic-plan/workflow/CLAUDE.md +0 -1
  157. package/skills/auditing-claude-config/CLAUDE.md +0 -1
  158. package/skills/autoconverge/CLAUDE.md +0 -1
  159. package/skills/autoconverge/reference/CLAUDE.md +0 -1
  160. package/skills/autoconverge/workflow/CLAUDE.md +0 -1
  161. package/skills/autoconverge/workflow/autoconverge_report_constants/CLAUDE.md +0 -1
  162. package/skills/bugteam/CLAUDE.md +0 -1
  163. package/skills/bugteam/reference/CLAUDE.md +0 -1
  164. package/skills/bugteam/reference/obstacles/CLAUDE.md +0 -1
  165. package/skills/bugteam/scripts/CLAUDE.md +0 -1
  166. package/skills/bugteam/scripts/bugteam_scripts_constants/CLAUDE.md +0 -1
  167. package/skills/codex-review/CLAUDE.md +0 -1
  168. package/skills/codex-review/reference/CLAUDE.md +0 -1
  169. package/skills/codex-review/scripts/codex_review_scripts_constants/CLAUDE.md +0 -1
  170. package/skills/copilot-review/CLAUDE.md +0 -1
  171. package/skills/everything-search/CLAUDE.md +0 -1
  172. package/skills/fresh-branch/CLAUDE.md +0 -1
  173. package/skills/grok-spawn/CLAUDE.md +0 -1
  174. package/skills/pr-converge/CLAUDE.md +0 -1
  175. package/skills/pr-converge/pr_converge_skill_constants/CLAUDE.md +0 -1
  176. package/skills/pr-converge/reference/CLAUDE.md +0 -1
  177. package/skills/pr-converge/reference/obstacles/CLAUDE.md +0 -1
  178. package/skills/pr-converge/scripts/CLAUDE.md +0 -1
  179. package/skills/pr-converge/scripts/pr_converge_scripts_constants/CLAUDE.md +0 -1
  180. package/skills/pr-converge/workflows/CLAUDE.md +0 -1
  181. package/skills/rebase/CLAUDE.md +0 -1
  182. package/skills/recall/CLAUDE.md +0 -1
  183. package/skills/remember/CLAUDE.md +0 -1
  184. package/skills/session-log/CLAUDE.md +0 -1
  185. package/skills/session-tidy/CLAUDE.md +0 -1
  186. package/skills/skill-builder/CLAUDE.md +0 -1
  187. package/skills/skill-builder/references/CLAUDE.md +0 -1
  188. package/skills/skill-builder/templates/CLAUDE.md +0 -1
  189. package/skills/skill-builder/workflows/CLAUDE.md +0 -1
  190. package/skills/task-build/CLAUDE.md +0 -1
  191. package/skills/update/CLAUDE.md +0 -1
  192. /package/{agents → .agents/agents}/clean-coder.md +0 -0
  193. /package/{agents → .agents/agents}/code-quality-agent.md +0 -0
  194. /package/{agents → .agents/agents}/git-commit-crafter.md +0 -0
  195. /package/{agents → .agents/agents}/issue-tracker.md +0 -0
  196. /package/{agents → .agents/agents}/plan-packet-validator.md +0 -0
  197. /package/{agents → .agents/agents}/pr-description-writer.md +0 -0
  198. /package/{agents → .agents/agents}/session-advisor.md +0 -0
  199. /package/{agents → .agents/agents}/skill-writer-agent.md +0 -0
  200. /package/{skills → .agents/skills}/_shared/advisor/AGENTS.md +0 -0
  201. /package/{skills → .agents/skills}/_shared/advisor/advisor-protocol.md +0 -0
  202. /package/{skills → .agents/skills}/_shared/advisor/scripts/README.md +0 -0
  203. /package/{skills → .agents/skills}/_shared/end-of-run-gotcha-recommendations.md +0 -0
  204. /package/{skills → .agents/skills}/_shared/pr-loop/AGENTS.md +0 -0
  205. /package/{skills → .agents/skills}/_shared/pr-loop/audit-contract.md +0 -0
  206. /package/{skills → .agents/skills}/_shared/pr-loop/audit-reply-template.md +0 -0
  207. /package/{skills → .agents/skills}/_shared/pr-loop/code-rules-gate.md +0 -0
  208. /package/{skills → .agents/skills}/_shared/pr-loop/fix-protocol.md +0 -0
  209. /package/{skills → .agents/skills}/_shared/pr-loop/gh-payloads.md +0 -0
  210. /package/{skills → .agents/skills}/_shared/pr-loop/portable-driver.md +0 -0
  211. /package/{skills → .agents/skills}/_shared/pr-loop/post-audit-thread-contract.md +0 -0
  212. /package/{skills → .agents/skills}/_shared/pr-loop/precatch-rubric.md +0 -0
  213. /package/{skills → .agents/skills}/_shared/pr-loop/prompts/AGENTS.md +0 -0
  214. /package/{skills → .agents/skills}/_shared/pr-loop/prompts/pr-consistency-audit.xml +0 -0
  215. /package/{skills → .agents/skills}/_shared/pr-loop/scripts/AGENTS.md +0 -0
  216. /package/{skills → .agents/skills}/_shared/pr-loop/scripts/RUNTIME_SCRIPTS.md +0 -0
  217. /package/{skills → .agents/skills}/_shared/pr-loop/scripts/_cli_utils.py +0 -0
  218. /package/{skills → .agents/skills}/_shared/pr-loop/scripts/_path_resolver.py +0 -0
  219. /package/{skills → .agents/skills}/_shared/pr-loop/scripts/_xml_utils.py +0 -0
  220. /package/{skills → .agents/skills}/_shared/pr-loop/scripts/audit_category_schema.py +0 -0
  221. /package/{skills → .agents/skills}/_shared/pr-loop/scripts/build_audit_prompt.py +0 -0
  222. /package/{skills → .agents/skills}/_shared/pr-loop/scripts/build_converge_task_list.py +0 -0
  223. /package/{skills → .agents/skills}/_shared/pr-loop/scripts/build_fix_prompt.py +0 -0
  224. /package/{skills → .agents/skills}/_shared/pr-loop/scripts/init_loop_state.py +0 -0
  225. /package/{skills → .agents/skills}/_shared/pr-loop/scripts/portable_converge_driver.py +0 -0
  226. /package/{skills → .agents/skills}/_shared/pr-loop/scripts/preflight_worktree.py +0 -0
  227. /package/{skills → .agents/skills}/_shared/pr-loop/scripts/select_converge_pacer.py +0 -0
  228. /package/{skills → .agents/skills}/_shared/pr-loop/scripts/skills_pr_loop_constants/AGENTS.md +0 -0
  229. /package/{skills → .agents/skills}/_shared/pr-loop/scripts/skills_pr_loop_constants/__init__.py +0 -0
  230. /package/{skills → .agents/skills}/_shared/pr-loop/scripts/skills_pr_loop_constants/converge_task_list_constants.py +0 -0
  231. /package/{skills → .agents/skills}/_shared/pr-loop/scripts/skills_pr_loop_constants/handoff_constants.py +0 -0
  232. /package/{skills → .agents/skills}/_shared/pr-loop/scripts/skills_pr_loop_constants/pacer_constants.py +0 -0
  233. /package/{skills → .agents/skills}/_shared/pr-loop/scripts/skills_pr_loop_constants/path_resolver_constants.py +0 -0
  234. /package/{skills → .agents/skills}/_shared/pr-loop/scripts/skills_pr_loop_constants/portable_driver_constants.py +0 -0
  235. /package/{skills → .agents/skills}/_shared/pr-loop/scripts/skills_pr_loop_constants/preflight_constants.py +0 -0
  236. /package/{skills → .agents/skills}/_shared/pr-loop/scripts/teardown_worktrees.py +0 -0
  237. /package/{skills → .agents/skills}/_shared/pr-loop/scripts/test__path_resolver.py +0 -0
  238. /package/{skills → .agents/skills}/_shared/pr-loop/scripts/test_audit_category_schema.py +0 -0
  239. /package/{skills → .agents/skills}/_shared/pr-loop/scripts/test_build_converge_task_list.py +0 -0
  240. /package/{skills → .agents/skills}/_shared/pr-loop/scripts/test_build_fix_prompt.py +0 -0
  241. /package/{skills → .agents/skills}/_shared/pr-loop/scripts/test_init_loop_state.py +0 -0
  242. /package/{skills → .agents/skills}/_shared/pr-loop/scripts/test_portable_converge_driver.py +0 -0
  243. /package/{skills → .agents/skills}/_shared/pr-loop/scripts/test_preflight_worktree.py +0 -0
  244. /package/{skills → .agents/skills}/_shared/pr-loop/scripts/test_select_converge_pacer.py +0 -0
  245. /package/{skills → .agents/skills}/_shared/pr-loop/scripts/test_teardown_worktrees.py +0 -0
  246. /package/{skills → .agents/skills}/_shared/pr-loop/scripts/test_write_handoff.py +0 -0
  247. /package/{skills → .agents/skills}/_shared/pr-loop/scripts/write_handoff.py +0 -0
  248. /package/{skills → .agents/skills}/_shared/pr-loop/state-schema.md +0 -0
  249. /package/{skills → .agents/skills}/_shared/pr-loop/worker-spawn.md +0 -0
  250. /package/{skills → .agents/skills}/anthropic-plan/SKILL.md +0 -0
  251. /package/{skills → .agents/skills}/anthropic-plan/scripts/AGENTS.md +0 -0
  252. /package/{skills → .agents/skills}/anthropic-plan/scripts/anthropic_plan_scripts_constants/AGENTS.md +0 -0
  253. /package/{skills → .agents/skills}/anthropic-plan/scripts/anthropic_plan_scripts_constants/__init__.py +0 -0
  254. /package/{skills → .agents/skills}/anthropic-plan/scripts/anthropic_plan_scripts_constants/validate_packet_constants.py +0 -0
  255. /package/{skills → .agents/skills}/anthropic-plan/scripts/test_validate_packet.py +0 -0
  256. /package/{skills → .agents/skills}/anthropic-plan/scripts/validate_packet.py +0 -0
  257. /package/{skills → .agents/skills}/anthropic-plan/templates/AGENTS.md +0 -0
  258. /package/{skills → .agents/skills}/anthropic-plan/templates/README.md +0 -0
  259. /package/{skills → .agents/skills}/anthropic-plan/templates/build-prompt.md +0 -0
  260. /package/{skills → .agents/skills}/anthropic-plan/templates/reuse-audit.md +0 -0
  261. /package/{skills → .agents/skills}/anthropic-plan/templates/source-map.md +0 -0
  262. /package/{skills → .agents/skills}/anthropic-plan/templates/visual-plan.template.html +0 -0
  263. /package/{skills → .agents/skills}/anthropic-plan/workflow/AGENTS.md +0 -0
  264. /package/{skills → .agents/skills}/anthropic-plan/workflow/plan-packet.contract.test.mjs +0 -0
  265. /package/{skills → .agents/skills}/anthropic-plan/workflow/plan-packet.mjs +0 -0
  266. /package/{skills → .agents/skills}/auditing-claude-config/AGENTS.md +0 -0
  267. /package/{skills → .agents/skills}/auditing-claude-config/SKILL.md +0 -0
  268. /package/{skills → .agents/skills}/auditing-claude-config/reference/probe-hook.md +0 -0
  269. /package/{skills → .agents/skills}/autoconverge/AGENTS.md +0 -0
  270. /package/{skills → .agents/skills}/autoconverge/SKILL.md +0 -0
  271. /package/{skills → .agents/skills}/autoconverge/reference/AGENTS.md +0 -0
  272. /package/{skills → .agents/skills}/autoconverge/reference/closing-report.md +0 -0
  273. /package/{skills → .agents/skills}/autoconverge/reference/convergence.md +0 -0
  274. /package/{skills → .agents/skills}/autoconverge/reference/copilot-findings.md +0 -0
  275. /package/{skills → .agents/skills}/autoconverge/reference/gotchas.md +0 -0
  276. /package/{skills → .agents/skills}/autoconverge/reference/headless-safety.md +0 -0
  277. /package/{skills → .agents/skills}/autoconverge/reference/multi-pr.md +0 -0
  278. /package/{skills → .agents/skills}/autoconverge/reference/self-closing-loop.md +0 -0
  279. /package/{skills → .agents/skills}/autoconverge/reference/stop-conditions.md +0 -0
  280. /package/{skills → .agents/skills}/autoconverge/test_portable_pacer_gate.py +0 -0
  281. /package/{skills → .agents/skills}/autoconverge/workflow/AGENTS.md +0 -0
  282. /package/{skills → .agents/skills}/autoconverge/workflow/aggregate_runs.py +0 -0
  283. /package/{skills → .agents/skills}/autoconverge/workflow/autoconverge_report_constants/AGENTS.md +0 -0
  284. /package/{skills → .agents/skills}/autoconverge/workflow/autoconverge_report_constants/__init__.py +0 -0
  285. /package/{skills → .agents/skills}/autoconverge/workflow/autoconverge_report_constants/render_report_constants.py +0 -0
  286. /package/{skills → .agents/skills}/autoconverge/workflow/converge.clean-audit.test.mjs +0 -0
  287. /package/{skills → .agents/skills}/autoconverge/workflow/converge.codex-gate.test.mjs +0 -0
  288. /package/{skills → .agents/skills}/autoconverge/workflow/converge.contract.test.mjs +0 -0
  289. /package/{skills → .agents/skills}/autoconverge/workflow/converge.copilot-gate.test.mjs +0 -0
  290. /package/{skills → .agents/skills}/autoconverge/workflow/converge.fix-progress.test.mjs +0 -0
  291. /package/{skills → .agents/skills}/autoconverge/workflow/converge.fix-recovery.test.mjs +0 -0
  292. /package/{skills → .agents/skills}/autoconverge/workflow/converge.merge-conflict.test.mjs +0 -0
  293. /package/{skills → .agents/skills}/autoconverge/workflow/converge.mjs +0 -0
  294. /package/{skills → .agents/skills}/autoconverge/workflow/converge.p2-advance.test.mjs +0 -0
  295. /package/{skills → .agents/skills}/autoconverge/workflow/converge.path-aware.test.mjs +0 -0
  296. /package/{skills → .agents/skills}/autoconverge/workflow/converge.precatch.test.mjs +0 -0
  297. /package/{skills → .agents/skills}/autoconverge/workflow/converge.run-input.test.mjs +0 -0
  298. /package/{skills → .agents/skills}/autoconverge/workflow/converge_multi.mjs +0 -0
  299. /package/{skills → .agents/skills}/autoconverge/workflow/converge_multi.run-input.test.mjs +0 -0
  300. /package/{skills → .agents/skills}/autoconverge/workflow/convergence_summary.py +0 -0
  301. /package/{skills → .agents/skills}/autoconverge/workflow/fixtures/wf_run/subagents/workflows/wf_881252e6-700/agent-a11d903476b803493.jsonl +0 -0
  302. /package/{skills → .agents/skills}/autoconverge/workflow/fixtures/wf_run/subagents/workflows/wf_881252e6-700/agent-a26213978adeef6fb.jsonl +0 -0
  303. /package/{skills → .agents/skills}/autoconverge/workflow/fixtures/wf_run/subagents/workflows/wf_881252e6-700/agent-a3def0d15ed9d9110.jsonl +0 -0
  304. /package/{skills → .agents/skills}/autoconverge/workflow/fixtures/wf_run/subagents/workflows/wf_881252e6-700/agent-a41f41b1b708ee3b7.jsonl +0 -0
  305. /package/{skills → .agents/skills}/autoconverge/workflow/fixtures/wf_run/subagents/workflows/wf_881252e6-700/agent-a758b880abecc3ff7.jsonl +0 -0
  306. /package/{skills → .agents/skills}/autoconverge/workflow/fixtures/wf_run/subagents/workflows/wf_881252e6-700/agent-a8897b89656b1bd16.jsonl +0 -0
  307. /package/{skills → .agents/skills}/autoconverge/workflow/fixtures/wf_run/subagents/workflows/wf_881252e6-700/agent-ab1c2d3e4f5a6b7c8.jsonl +0 -0
  308. /package/{skills → .agents/skills}/autoconverge/workflow/fixtures/wf_run/subagents/workflows/wf_881252e6-700/agent-abd463d744a1437bc.jsonl +0 -0
  309. /package/{skills → .agents/skills}/autoconverge/workflow/fixtures/wf_run/subagents/workflows/wf_881252e6-700/agent-ad19d027ae8ee1816.jsonl +0 -0
  310. /package/{skills → .agents/skills}/autoconverge/workflow/fixtures/wf_run/workflows/wf_881252e6-700.json +0 -0
  311. /package/{skills → .agents/skills}/autoconverge/workflow/render_report.py +0 -0
  312. /package/{skills → .agents/skills}/autoconverge/workflow/test_aggregate_runs.py +0 -0
  313. /package/{skills → .agents/skills}/autoconverge/workflow/test_convergence_summary.py +0 -0
  314. /package/{skills → .agents/skills}/autoconverge/workflow/test_render_report.py +0 -0
  315. /package/{skills → .agents/skills}/beat-sheet/SKILL.md +0 -0
  316. /package/{skills → .agents/skills}/beat-sheet/reference/visual-beats.md +0 -0
  317. /package/{skills → .agents/skills}/bugteam/AGENTS.md +0 -0
  318. /package/{skills → .agents/skills}/bugteam/CONSTRAINTS.md +0 -0
  319. /package/{skills → .agents/skills}/bugteam/EXAMPLES.md +0 -0
  320. /package/{skills → .agents/skills}/bugteam/PROMPTS.md +0 -0
  321. /package/{skills → .agents/skills}/bugteam/SKILL.md +0 -0
  322. /package/{skills → .agents/skills}/bugteam/reference/AGENTS.md +0 -0
  323. /package/{skills → .agents/skills}/bugteam/reference/README.md +0 -0
  324. /package/{skills → .agents/skills}/bugteam/reference/audit-and-teammates.md +0 -0
  325. /package/{skills → .agents/skills}/bugteam/reference/copilot-gap-analysis.md +0 -0
  326. /package/{skills → .agents/skills}/bugteam/reference/design-rationale.md +0 -0
  327. /package/{skills → .agents/skills}/bugteam/reference/github-pr-reviews.md +0 -0
  328. /package/{skills → .agents/skills}/bugteam/reference/obstacles/AGENTS.md +0 -0
  329. /package/{skills → .agents/skills}/bugteam/reference/obstacles/audit-assign-ids.md +0 -0
  330. /package/{skills → .agents/skills}/bugteam/reference/obstacles/audit-capture-excerpts.md +0 -0
  331. /package/{skills → .agents/skills}/bugteam/reference/obstacles/audit-walk-categories.md +0 -0
  332. /package/{skills → .agents/skills}/bugteam/reference/obstacles/audit-write-xml.md +0 -0
  333. /package/{skills → .agents/skills}/bugteam/reference/obstacles/fix-append-summary.md +0 -0
  334. /package/{skills → .agents/skills}/bugteam/reference/obstacles/fix-apply-fixes.md +0 -0
  335. /package/{skills → .agents/skills}/bugteam/reference/obstacles/fix-git-add-commit.md +0 -0
  336. /package/{skills → .agents/skills}/bugteam/reference/obstacles/fix-git-push.md +0 -0
  337. /package/{skills → .agents/skills}/bugteam/reference/obstacles/fix-post-reply.md +0 -0
  338. /package/{skills → .agents/skills}/bugteam/reference/obstacles/fix-publish-summary.md +0 -0
  339. /package/{skills → .agents/skills}/bugteam/reference/obstacles/fix-py-compile.md +0 -0
  340. /package/{skills → .agents/skills}/bugteam/reference/obstacles/fix-read-files.md +0 -0
  341. /package/{skills → .agents/skills}/bugteam/reference/obstacles/fix-resolve-thread.md +0 -0
  342. /package/{skills → .agents/skills}/bugteam/reference/obstacles/fix-test-suite.md +0 -0
  343. /package/{skills → .agents/skills}/bugteam/reference/obstacles/fix-violation-count.md +0 -0
  344. /package/{skills → .agents/skills}/bugteam/reference/obstacles/fix-write-xml.md +0 -0
  345. /package/{skills → .agents/skills}/bugteam/reference/team-setup.md +0 -0
  346. /package/{skills → .agents/skills}/bugteam/scripts/AGENTS.md +0 -0
  347. /package/{skills → .agents/skills}/bugteam/scripts/README.md +0 -0
  348. /package/{skills → .agents/skills}/bugteam/scripts/bugteam_scripts_constants/AGENTS.md +0 -0
  349. /package/{skills → .agents/skills}/bugteam/scripts/bugteam_scripts_constants/__init__.py +0 -0
  350. /package/{skills → .agents/skills}/bugteam/scripts/bugteam_scripts_constants/probe_code_rules_enforcer_check_constants.py +0 -0
  351. /package/{skills → .agents/skills}/bugteam/scripts/bugteam_scripts_constants/reflow_skill_md_constants.py +0 -0
  352. /package/{skills → .agents/skills}/bugteam/scripts/bugteam_scripts_constants/windows_safe_rmtree_constants.py +0 -0
  353. /package/{skills → .agents/skills}/bugteam/scripts/probe_code_rules_enforcer_check.py +0 -0
  354. /package/{skills → .agents/skills}/bugteam/scripts/test_bugteam_code_rules_gate.py +0 -0
  355. /package/{skills → .agents/skills}/bugteam/scripts/test_bugteam_fix_hookspath.py +0 -0
  356. /package/{skills → .agents/skills}/bugteam/scripts/test_bugteam_preflight.py +0 -0
  357. /package/{skills → .agents/skills}/bugteam/scripts/test_probe_code_rules_enforcer_check.py +0 -0
  358. /package/{skills → .agents/skills}/bugteam/scripts/test_windows_safe_rmtree.py +0 -0
  359. /package/{skills → .agents/skills}/bugteam/scripts/windows_safe_rmtree.py +0 -0
  360. /package/{skills → .agents/skills}/bugteam/sources.md +0 -0
  361. /package/{skills → .agents/skills}/bugteam/test_skill_additions.py +0 -0
  362. /package/{skills → .agents/skills}/closeout/SKILL.md +0 -0
  363. /package/{skills → .agents/skills}/closeout/reference/handoff-prompt-template.md +0 -0
  364. /package/{skills → .agents/skills}/closeout/reference/pii-redaction-checklist.md +0 -0
  365. /package/{skills → .agents/skills}/codex-review/AGENTS.md +0 -0
  366. /package/{skills → .agents/skills}/codex-review/SKILL.md +0 -0
  367. /package/{skills → .agents/skills}/codex-review/reference/AGENTS.md +0 -0
  368. /package/{skills → .agents/skills}/codex-review/reference/cli-contract.md +0 -0
  369. /package/{skills → .agents/skills}/codex-review/reference/loop-integration.md +0 -0
  370. /package/{skills → .agents/skills}/codex-review/scripts/codex_down_classifier.py +0 -0
  371. /package/{skills → .agents/skills}/codex-review/scripts/codex_review_scripts_constants/AGENTS.md +0 -0
  372. /package/{skills → .agents/skills}/codex-review/scripts/codex_review_scripts_constants/__init__.py +0 -0
  373. /package/{skills → .agents/skills}/codex-review/scripts/codex_review_scripts_constants/classifier_constants.py +0 -0
  374. /package/{skills → .agents/skills}/codex-review/scripts/codex_review_scripts_constants/codex_usage_probe_constants.py +0 -0
  375. /package/{skills → .agents/skills}/codex-review/scripts/codex_review_scripts_constants/findings_constants.py +0 -0
  376. /package/{skills → .agents/skills}/codex-review/scripts/codex_review_scripts_constants/run_constants.py +0 -0
  377. /package/{skills → .agents/skills}/codex-review/scripts/fixtures/auth_failure_synthetic.txt +0 -0
  378. /package/{skills → .agents/skills}/codex-review/scripts/fixtures/config_load_failure_v0.125.0.txt +0 -0
  379. /package/{skills → .agents/skills}/codex-review/scripts/fixtures/freeform_findings_v0.144.3.txt +0 -0
  380. /package/{skills → .agents/skills}/codex-review/scripts/fixtures/model_rejection_v0.125.0.jsonl +0 -0
  381. /package/{skills → .agents/skills}/codex-review/scripts/fixtures/structured_findings.txt +0 -0
  382. /package/{skills → .agents/skills}/codex-review/scripts/fixtures/success_stream_v0.144.3.jsonl +0 -0
  383. /package/{skills → .agents/skills}/codex-review/scripts/fixtures/unknown_failure_synthetic.txt +0 -0
  384. /package/{skills → .agents/skills}/codex-review/scripts/fixtures/usage_limit_synthetic.txt +0 -0
  385. /package/{skills → .agents/skills}/codex-review/scripts/parse_codex_findings.py +0 -0
  386. /package/{skills → .agents/skills}/codex-review/scripts/test_codex_down_classifier.py +0 -0
  387. /package/{skills → .agents/skills}/codex-review/scripts/test_codex_usage_probe.py +0 -0
  388. /package/{skills → .agents/skills}/codex-review/scripts/test_parse_codex_findings.py +0 -0
  389. /package/{skills → .agents/skills}/codex-review/scripts/test_run_codex_review.py +0 -0
  390. /package/{skills → .agents/skills}/comments/SKILL.md +0 -0
  391. /package/{skills → .agents/skills}/condensing-instructions/SKILL.md +0 -0
  392. /package/{skills → .agents/skills}/copilot-finding-triage/SKILL.md +0 -0
  393. /package/{skills → .agents/skills}/copilot-finding-triage/reference/tier-rubric.md +0 -0
  394. /package/{skills → .agents/skills}/copilot-finding-triage/scripts/conftest.py +0 -0
  395. /package/{skills → .agents/skills}/copilot-finding-triage/scripts/copilot_finding_triage_constants/__init__.py +0 -0
  396. /package/{skills → .agents/skills}/copilot-finding-triage/scripts/copilot_finding_triage_constants/config/__init__.py +0 -0
  397. /package/{skills → .agents/skills}/copilot-finding-triage/scripts/copilot_finding_triage_constants/config/notify_ntfy_constants.py +0 -0
  398. /package/{skills → .agents/skills}/copilot-finding-triage/scripts/notify_ntfy.py +0 -0
  399. /package/{skills → .agents/skills}/copilot-finding-triage/scripts/test_notify_ntfy.py +0 -0
  400. /package/{skills → .agents/skills}/copilot-finding-triage/templates/notification.md +0 -0
  401. /package/{skills → .agents/skills}/copilot-review/AGENTS.md +0 -0
  402. /package/{skills → .agents/skills}/copilot-review/SKILL.md +0 -0
  403. /package/{skills → .agents/skills}/copilot-review/templates/subagent-prompt.md +0 -0
  404. /package/{skills → .agents/skills}/descriptions/SKILL.md +0 -0
  405. /package/{skills → .agents/skills}/e-code-review/SKILL.md +0 -0
  406. /package/{skills → .agents/skills}/e-code-review/reference/fix.md +0 -0
  407. /package/{skills → .agents/skills}/e-code-review/reference/loop.md +0 -0
  408. /package/{skills → .agents/skills}/e-code-review/reference/low.md +0 -0
  409. /package/{skills → .agents/skills}/e-code-review/reference/medium.md +0 -0
  410. /package/{skills → .agents/skills}/e-code-review/reference/runner-selection.md +0 -0
  411. /package/{skills → .agents/skills}/e-code-review/reference/xhigh.md +0 -0
  412. /package/{skills → .agents/skills}/e-code-review/scripts/config/e_code_review_effort_constants/__init__.py +0 -0
  413. /package/{skills → .agents/skills}/e-code-review/scripts/config/e_code_review_effort_constants/effort_constants.py +0 -0
  414. /package/{skills → .agents/skills}/e-code-review/scripts/e_code_review_scripts_constants/__init__.py +0 -0
  415. /package/{skills → .agents/skills}/e-code-review/scripts/e_code_review_scripts_constants/finding_pipeline_constants.py +0 -0
  416. /package/{skills → .agents/skills}/e-code-review/scripts/e_code_review_scripts_constants/grok_code_review_constants.py +0 -0
  417. /package/{skills → .agents/skills}/e-code-review/scripts/effort_defaults_evidence.json +0 -0
  418. /package/{skills → .agents/skills}/e-code-review/scripts/effort_evaluation.py +0 -0
  419. /package/{skills → .agents/skills}/e-code-review/scripts/finding_pipeline.py +0 -0
  420. /package/{skills → .agents/skills}/e-code-review/scripts/fixtures/demanding.json +0 -0
  421. /package/{skills → .agents/skills}/e-code-review/scripts/fixtures/easy.json +0 -0
  422. /package/{skills → .agents/skills}/e-code-review/scripts/fixtures/medium.json +0 -0
  423. /package/{skills → .agents/skills}/e-code-review/scripts/grok_code_review.py +0 -0
  424. /package/{skills → .agents/skills}/e-code-review/scripts/test_effort_evaluation.py +0 -0
  425. /package/{skills → .agents/skills}/e-code-review/scripts/test_finding_pipeline.py +0 -0
  426. /package/{skills → .agents/skills}/e-code-review/scripts/test_grok_code_review.py +0 -0
  427. /package/{skills → .agents/skills}/e-simplify/SKILL.md +0 -0
  428. /package/{skills → .agents/skills}/emergencies/SKILL.md +0 -0
  429. /package/{skills → .agents/skills}/everything-search/AGENTS.md +0 -0
  430. /package/{skills → .agents/skills}/everything-search/SKILL.md +0 -0
  431. /package/{skills → .agents/skills}/fresh-branch/AGENTS.md +0 -0
  432. /package/{skills → .agents/skills}/fresh-branch/SKILL.md +0 -0
  433. /package/{skills → .agents/skills}/fresh-branch/scripts/create_fresh_branch.py +0 -0
  434. /package/{skills → .agents/skills}/fresh-branch/scripts/fresh_branch_git_commands.py +0 -0
  435. /package/{skills → .agents/skills}/fresh-branch/scripts/fresh_branch_scripts_constants/__init__.py +0 -0
  436. /package/{skills → .agents/skills}/fresh-branch/scripts/fresh_branch_scripts_constants/fresh_branch_cli_constants.py +0 -0
  437. /package/{skills → .agents/skills}/fresh-branch/scripts/pytest.ini +0 -0
  438. /package/{skills → .agents/skills}/fresh-branch/scripts/test_create_fresh_branch.py +0 -0
  439. /package/{skills → .agents/skills}/fresh-branch/scripts/test_fresh_branch_git_commands.py +0 -0
  440. /package/{skills → .agents/skills}/grok-spawn/AGENTS.md +0 -0
  441. /package/{skills → .agents/skills}/grok-spawn/SKILL.md +0 -0
  442. /package/{skills → .agents/skills}/grok-spawn/reference/flag-profiles.md +0 -0
  443. /package/{skills → .agents/skills}/grok-spawn/reference/worker-briefs.md +0 -0
  444. /package/{skills → .agents/skills}/grokify/SKILL.md +0 -0
  445. /package/{skills → .agents/skills}/grokify/capability-claims.test.mjs +0 -0
  446. /package/{skills → .agents/skills}/grokify/evals/parse-payload.test.mjs +0 -0
  447. /package/{skills → .agents/skills}/grokify/evals/run-capability-evals.mjs +0 -0
  448. /package/{skills → .agents/skills}/grokify/templates/handoff-template.md +0 -0
  449. /package/{skills → .agents/skills}/issue-tracker/SKILL.md +0 -0
  450. /package/{skills → .agents/skills}/issue-tracker/reference/epic-and-sub-issue-model.md +0 -0
  451. /package/{skills → .agents/skills}/issue-tracker/reference/handoff-schema.md +0 -0
  452. /package/{skills → .agents/skills}/issue-tracker/reference/operation-matrix.md +0 -0
  453. /package/{skills → .agents/skills}/orchestrator/SKILL.md +0 -0
  454. /package/{skills → .agents/skills}/orchestrator/scripts/status_gate.py +0 -0
  455. /package/{skills → .agents/skills}/orchestrator/scripts/status_gate_constants/__init__.py +0 -0
  456. /package/{skills → .agents/skills}/orchestrator/scripts/status_gate_constants/config/__init__.py +0 -0
  457. /package/{skills → .agents/skills}/orchestrator/scripts/status_gate_constants/config/constants.py +0 -0
  458. /package/{skills → .agents/skills}/orchestrator/scripts/test_status_gate.py +0 -0
  459. /package/{skills → .agents/skills}/orchestrator-refresh/SKILL.md +0 -0
  460. /package/{skills → .agents/skills}/plan-to-pr/SKILL.md +0 -0
  461. /package/{skills → .agents/skills}/plan-to-pr/reference/final-validation-tasks.md +0 -0
  462. /package/{skills → .agents/skills}/plan-to-pr/reference/model-routing.md +0 -0
  463. /package/{skills → .agents/skills}/plan-to-pr/reference/packet-contract.md +0 -0
  464. /package/{skills → .agents/skills}/plan-to-pr/reference/packet-schema.json +0 -0
  465. /package/{skills → .agents/skills}/plan-to-pr/reference/process-inventory.md +0 -0
  466. /package/{skills → .agents/skills}/plan-to-pr/reference/review-loop.md +0 -0
  467. /package/{skills → .agents/skills}/plan-to-pr/reference/run-record.schema.json +0 -0
  468. /package/{skills → .agents/skills}/plan-to-pr/reference/self-audit-tasks.md +0 -0
  469. /package/{skills → .agents/skills}/plan-to-pr/reference/task-seeds.md +0 -0
  470. /package/{skills → .agents/skills}/plan-to-pr/reference/task-ticket.md +0 -0
  471. /package/{skills → .agents/skills}/plan-to-pr/scripts/config/__init__.py +0 -0
  472. /package/{skills → .agents/skills}/plan-to-pr/scripts/config/constants.py +0 -0
  473. /package/{skills → .agents/skills}/plan-to-pr/scripts/create_packet.py +0 -0
  474. /package/{skills → .agents/skills}/plan-to-pr/scripts/load_skill_constants.py +0 -0
  475. /package/{skills → .agents/skills}/plan-to-pr/scripts/test_create_packet.py +0 -0
  476. /package/{skills → .agents/skills}/plan-to-pr/scripts/test_validate_packet.py +0 -0
  477. /package/{skills → .agents/skills}/plan-to-pr/scripts/test_validate_protocol.py +0 -0
  478. /package/{skills → .agents/skills}/plan-to-pr/scripts/test_validate_run.py +0 -0
  479. /package/{skills → .agents/skills}/plan-to-pr/scripts/validate_packet.py +0 -0
  480. /package/{skills → .agents/skills}/plan-to-pr/scripts/validate_protocol.py +0 -0
  481. /package/{skills → .agents/skills}/plan-to-pr/scripts/validate_run.py +0 -0
  482. /package/{skills → .agents/skills}/plan-to-pr/test_skill_contract.py +0 -0
  483. /package/{skills → .agents/skills}/plan-to-pr/test_task_ticket_contract.py +0 -0
  484. /package/{skills → .agents/skills}/pr-converge/AGENTS.md +0 -0
  485. /package/{skills → .agents/skills}/pr-converge/SKILL.md +0 -0
  486. /package/{skills → .agents/skills}/pr-converge/pr_converge_skill_constants/__init__.py +0 -0
  487. /package/{skills → .agents/skills}/pr-converge/reference/AGENTS.md +0 -0
  488. /package/{skills → .agents/skills}/pr-converge/reference/convergence-gates.md +0 -0
  489. /package/{skills → .agents/skills}/pr-converge/reference/examples.md +0 -0
  490. /package/{skills → .agents/skills}/pr-converge/reference/fix-protocol.md +0 -0
  491. /package/{skills → .agents/skills}/pr-converge/reference/ground-rules.md +0 -0
  492. /package/{skills → .agents/skills}/pr-converge/reference/multi-pr-orchestration.md +0 -0
  493. /package/{skills → .agents/skills}/pr-converge/reference/obstacles/AGENTS.md +0 -0
  494. /package/{skills → .agents/skills}/pr-converge/reference/obstacles/fix-post-replies.md +0 -0
  495. /package/{skills → .agents/skills}/pr-converge/reference/obstacles/fix-publish-summary.md +0 -0
  496. /package/{skills → .agents/skills}/pr-converge/reference/obstacles/fix-push.md +0 -0
  497. /package/{skills → .agents/skills}/pr-converge/reference/obstacles/fix-read-filelines.md +0 -0
  498. /package/{skills → .agents/skills}/pr-converge/reference/obstacles/fix-reset-state.md +0 -0
  499. /package/{skills → .agents/skills}/pr-converge/reference/obstacles/fix-resolve-threads.md +0 -0
  500. /package/{skills → .agents/skills}/pr-converge/reference/obstacles/fix-spawn-clean-coder.md +0 -0
  501. /package/{skills → .agents/skills}/pr-converge/reference/obstacles/fix-stage-commit.md +0 -0
  502. /package/{skills → .agents/skills}/pr-converge/reference/obstacles/fix-trigger-bugbot.md +0 -0
  503. /package/{skills → .agents/skills}/pr-converge/reference/obstacles/fix-write-test.md +0 -0
  504. /package/{skills → .agents/skills}/pr-converge/reference/per-tick.md +0 -0
  505. /package/{skills → .agents/skills}/pr-converge/reference/progress-checklist.md +0 -0
  506. /package/{skills → .agents/skills}/pr-converge/reference/state-schema.md +0 -0
  507. /package/{skills → .agents/skills}/pr-converge/reference/stop-conditions.md +0 -0
  508. /package/{skills → .agents/skills}/pr-converge/scripts/AGENTS.md +0 -0
  509. /package/{skills → .agents/skills}/pr-converge/scripts/README.md +0 -0
  510. /package/{skills → .agents/skills}/pr-converge/scripts/caller-window-pid.ps1 +0 -0
  511. /package/{skills → .agents/skills}/pr-converge/scripts/check_bugbot_ci.py +0 -0
  512. /package/{skills → .agents/skills}/pr-converge/scripts/check_convergence.py +0 -0
  513. /package/{skills → .agents/skills}/pr-converge/scripts/check_convergence_availability.py +0 -0
  514. /package/{skills → .agents/skills}/pr-converge/scripts/check_convergence_gates.py +0 -0
  515. /package/{skills → .agents/skills}/pr-converge/scripts/check_convergence_thread_gates.py +0 -0
  516. /package/{skills → .agents/skills}/pr-converge/scripts/check_pending_reviews.py +0 -0
  517. /package/{skills → .agents/skills}/pr-converge/scripts/conftest.py +0 -0
  518. /package/{skills → .agents/skills}/pr-converge/scripts/cursor-agents-continue-caller.cmd +0 -0
  519. /package/{skills → .agents/skills}/pr-converge/scripts/cursor-agents-continue-stop-others.ps1 +0 -0
  520. /package/{skills → .agents/skills}/pr-converge/scripts/cursor-agents-continue.ahk +0 -0
  521. /package/{skills → .agents/skills}/pr-converge/scripts/cursor-agents-continue.cmd +0 -0
  522. /package/{skills → .agents/skills}/pr-converge/scripts/fetch_copilot_reviews.py +0 -0
  523. /package/{skills → .agents/skills}/pr-converge/scripts/post_fix_reply.py +0 -0
  524. /package/{skills → .agents/skills}/pr-converge/scripts/pr_converge_scripts_constants/AGENTS.md +0 -0
  525. /package/{skills → .agents/skills}/pr-converge/scripts/pr_converge_scripts_constants/__init__.py +0 -0
  526. /package/{skills → .agents/skills}/pr-converge/scripts/pr_converge_scripts_constants/convergence_gate_constants.py +0 -0
  527. /package/{skills → .agents/skills}/pr-converge/scripts/pr_converge_scripts_constants/pr_converge_constants.py +0 -0
  528. /package/{skills → .agents/skills}/pr-converge/scripts/pr_converge_scripts_constants/reflow_skill_md_constants.py +0 -0
  529. /package/{skills → .agents/skills}/pr-converge/scripts/test_check_bugbot_ci.py +0 -0
  530. /package/{skills → .agents/skills}/pr-converge/scripts/test_check_convergence.py +0 -0
  531. /package/{skills → .agents/skills}/pr-converge/scripts/test_check_convergence_availability.py +0 -0
  532. /package/{skills → .agents/skills}/pr-converge/scripts/test_check_convergence_codex.py +0 -0
  533. /package/{skills → .agents/skills}/pr-converge/scripts/test_check_convergence_contract.py +0 -0
  534. /package/{skills → .agents/skills}/pr-converge/scripts/test_check_convergence_fixture.py +0 -0
  535. /package/{skills → .agents/skills}/pr-converge/scripts/test_check_convergence_gates.py +0 -0
  536. /package/{skills → .agents/skills}/pr-converge/scripts/test_check_convergence_thread_gates.py +0 -0
  537. /package/{skills → .agents/skills}/pr-converge/scripts/test_cursor_agents_continue.py +0 -0
  538. /package/{skills → .agents/skills}/pr-converge/scripts/test_reflow_skill_md.py +0 -0
  539. /package/{skills → .agents/skills}/pr-converge/test_portable_pacer_gate.py +0 -0
  540. /package/{skills → .agents/skills}/pr-converge/test_step5_host_branch.py +0 -0
  541. /package/{skills → .agents/skills}/pr-converge/workflows/AGENTS.md +0 -0
  542. /package/{skills → .agents/skills}/pr-converge/workflows/schedule-wakeup-loop.md +0 -0
  543. /package/{skills → .agents/skills}/pr-fix-protocol/SKILL.md +0 -0
  544. /package/{skills → .agents/skills}/pr-loop-cloud-transport/SKILL.md +0 -0
  545. /package/{skills → .agents/skills}/pr-loop-cloud-transport/reference/identity-and-hooks.md +0 -0
  546. /package/{skills → .agents/skills}/pr-loop-cloud-transport/reference/substitution-matrix.md +0 -0
  547. /package/{skills → .agents/skills}/pr-loop-lifecycle/SKILL.md +0 -0
  548. /package/{skills → .agents/skills}/pr-loop-lifecycle/reference/teardown-publish-permissions.md +0 -0
  549. /package/{skills → .agents/skills}/privacy-hygiene/SKILL.md +0 -0
  550. /package/{skills → .agents/skills}/privacy-hygiene/reference/sweep-procedure.md +0 -0
  551. /package/{skills → .agents/skills}/prototype/SKILL.md +0 -0
  552. /package/{skills → .agents/skills}/prototype/reference/honest-limitations.md +0 -0
  553. /package/{skills → .agents/skills}/prototype/reference/promotion-tasks.md +0 -0
  554. /package/{skills → .agents/skills}/prototype/scripts/build_sandbox_settings.py +0 -0
  555. /package/{skills → .agents/skills}/prototype/scripts/conftest.py +0 -0
  556. /package/{skills → .agents/skills}/prototype/scripts/launch_sandbox.py +0 -0
  557. /package/{skills → .agents/skills}/prototype/scripts/probe_sandbox_safety.py +0 -0
  558. /package/{skills → .agents/skills}/prototype/scripts/prototype_scripts_constants/__init__.py +0 -0
  559. /package/{skills → .agents/skills}/prototype/scripts/prototype_scripts_constants/config/__init__.py +0 -0
  560. /package/{skills → .agents/skills}/prototype/scripts/prototype_scripts_constants/config/build_sandbox_settings_constants.py +0 -0
  561. /package/{skills → .agents/skills}/prototype/scripts/prototype_scripts_constants/config/launch_sandbox_constants.py +0 -0
  562. /package/{skills → .agents/skills}/prototype/scripts/prototype_scripts_constants/config/probe_sandbox_safety_constants.py +0 -0
  563. /package/{skills → .agents/skills}/prototype/scripts/prototype_scripts_constants/config/prototype_common_constants.py +0 -0
  564. /package/{skills → .agents/skills}/prototype/scripts/test_build_sandbox_settings.py +0 -0
  565. /package/{skills → .agents/skills}/prototype/scripts/test_launch_sandbox.py +0 -0
  566. /package/{skills → .agents/skills}/prototype/workflows/promotion.md +0 -0
  567. /package/{skills → .agents/skills}/prototype/workflows/sandbox.md +0 -0
  568. /package/{skills → .agents/skills}/rebase/AGENTS.md +0 -0
  569. /package/{skills → .agents/skills}/rebase/SKILL.md +0 -0
  570. /package/{skills → .agents/skills}/recall/AGENTS.md +0 -0
  571. /package/{skills → .agents/skills}/recall/SKILL.md +0 -0
  572. /package/{skills → .agents/skills}/release-notes-html/SKILL.md +0 -0
  573. /package/{skills → .agents/skills}/remember/AGENTS.md +0 -0
  574. /package/{skills → .agents/skills}/remember/SKILL.md +0 -0
  575. /package/{skills → .agents/skills}/reviewer-gates/SKILL.md +0 -0
  576. /package/{skills → .agents/skills}/reviews/SKILL.md +0 -0
  577. /package/{skills → .agents/skills}/session-log/AGENTS.md +0 -0
  578. /package/{skills → .agents/skills}/session-log/SKILL.md +0 -0
  579. /package/{skills → .agents/skills}/session-log/templates/frontmatter.md +0 -0
  580. /package/{skills → .agents/skills}/session-tidy/AGENTS.md +0 -0
  581. /package/{skills → .agents/skills}/session-tidy/SKILL.md +0 -0
  582. /package/{skills → .agents/skills}/show/SKILL.md +0 -0
  583. /package/{skills → .agents/skills}/show/references/accessibility.md +0 -0
  584. /package/{skills → .agents/skills}/show/references/art.md +0 -0
  585. /package/{skills → .agents/skills}/show/references/charts.md +0 -0
  586. /package/{skills → .agents/skills}/show/references/core-design.md +0 -0
  587. /package/{skills → .agents/skills}/show/references/erds.md +0 -0
  588. /package/{skills → .agents/skills}/show/references/flowcharts.md +0 -0
  589. /package/{skills → .agents/skills}/show/references/host-and-html.md +0 -0
  590. /package/{skills → .agents/skills}/show/references/illustrative-diagrams.md +0 -0
  591. /package/{skills → .agents/skills}/show/references/interaction.md +0 -0
  592. /package/{skills → .agents/skills}/show/references/mockups.md +0 -0
  593. /package/{skills → .agents/skills}/show/references/quality-gates.md +0 -0
  594. /package/{skills → .agents/skills}/show/references/structural-diagrams.md +0 -0
  595. /package/{skills → .agents/skills}/show/references/subject-inventory.md +0 -0
  596. /package/{skills → .agents/skills}/show/references/svg-contract.md +0 -0
  597. /package/{skills → .agents/skills}/show/routing.yaml +0 -0
  598. /package/{skills → .agents/skills}/show/samples/pr1262-v2.svg +0 -0
  599. /package/{skills → .agents/skills}/show/scripts/README.md +0 -0
  600. /package/{skills → .agents/skills}/show/scripts/validate-artifact.py +0 -0
  601. /package/{skills → .agents/skills}/show/scripts/validate-package.py +0 -0
  602. /package/{skills → .agents/skills}/show/templates/html-widget.html +0 -0
  603. /package/{skills → .agents/skills}/show/templates/svg-base.svg +0 -0
  604. /package/{skills → .agents/skills}/show/tests/fixtures/css-var.svg +0 -0
  605. /package/{skills → .agents/skills}/show/tests/fixtures/dead-ref.svg +0 -0
  606. /package/{skills → .agents/skills}/show/tests/fixtures/filled-glyph.svg +0 -0
  607. /package/{skills → .agents/skills}/show/tests/fixtures/inherited-fill.svg +0 -0
  608. /package/{skills → .agents/skills}/show/tests/fixtures/invalid.svg +0 -0
  609. /package/{skills → .agents/skills}/show/tests/fixtures/large-canvas.svg +0 -0
  610. /package/{skills → .agents/skills}/show/tests/fixtures/unfilled-connector.svg +0 -0
  611. /package/{skills → .agents/skills}/show/tests/fixtures/valid.html +0 -0
  612. /package/{skills → .agents/skills}/show/tests/test_validate-artifact.py +0 -0
  613. /package/{skills → .agents/skills}/show/tests/test_validators.py +0 -0
  614. /package/{skills → .agents/skills}/show/workflows/create-visual.md +0 -0
  615. /package/{skills → .agents/skills}/show/workflows/review-visual.md +0 -0
  616. /package/{skills → .agents/skills}/skill-builder/AGENTS.md +0 -0
  617. /package/{skills → .agents/skills}/skill-builder/SKILL.md +0 -0
  618. /package/{skills → .agents/skills}/skill-builder/references/AGENTS.md +0 -0
  619. /package/{skills → .agents/skills}/skill-builder/references/delegation-map.md +0 -0
  620. /package/{skills → .agents/skills}/skill-builder/references/description-field.md +0 -0
  621. /package/{skills → .agents/skills}/skill-builder/references/progressive-disclosure.md +0 -0
  622. /package/{skills → .agents/skills}/skill-builder/references/self-audit-checklist.md +0 -0
  623. /package/{skills → .agents/skills}/skill-builder/references/skill-modularity.md +0 -0
  624. /package/{skills → .agents/skills}/skill-builder/references/skill-types.md +0 -0
  625. /package/{skills → .agents/skills}/skill-builder/references/thariq-x-post-skills.json +0 -0
  626. /package/{skills → .agents/skills}/skill-builder/templates/AGENTS.md +0 -0
  627. /package/{skills → .agents/skills}/skill-builder/templates/gap-analysis.md +0 -0
  628. /package/{skills → .agents/skills}/skill-builder/workflows/AGENTS.md +0 -0
  629. /package/{skills → .agents/skills}/skill-builder/workflows/improve-skill.md +0 -0
  630. /package/{skills → .agents/skills}/skill-builder/workflows/new-skill.md +0 -0
  631. /package/{skills → .agents/skills}/skill-builder/workflows/polish-skill.md +0 -0
  632. /package/{skills → .agents/skills}/small-cl/SKILL.md +0 -0
  633. /package/{skills → .agents/skills}/split-pr/SKILL.md +0 -0
  634. /package/{skills → .agents/skills}/split-pr/reference/path-layers.md +0 -0
  635. /package/{skills → .agents/skills}/split-pr/reference/split-further-loop.md +0 -0
  636. /package/{skills → .agents/skills}/split-pr/reference/splitting-principles.md +0 -0
  637. /package/{skills → .agents/skills}/split-pr/scripts/analyze_pr.py +0 -0
  638. /package/{skills → .agents/skills}/split-pr/scripts/categorize_files.py +0 -0
  639. /package/{skills → .agents/skills}/split-pr/scripts/config/__init__.py +0 -0
  640. /package/{skills → .agents/skills}/split-pr/scripts/config/dependency_constants.py +0 -0
  641. /package/{skills → .agents/skills}/split-pr/scripts/config/git_operations_constants.py +0 -0
  642. /package/{skills → .agents/skills}/split-pr/scripts/config/packing_constants.py +0 -0
  643. /package/{skills → .agents/skills}/split-pr/scripts/config/plan_constants.py +0 -0
  644. /package/{skills → .agents/skills}/split-pr/scripts/config/split_pr_constants.py +0 -0
  645. /package/{skills → .agents/skills}/split-pr/scripts/execute_split_slices.py +0 -0
  646. /package/{skills → .agents/skills}/split-pr/scripts/pack_files_into_slices.py +0 -0
  647. /package/{skills → .agents/skills}/split-pr/scripts/split_pr_dependency_graph.py +0 -0
  648. /package/{skills → .agents/skills}/split-pr/scripts/split_pr_git_operations.py +0 -0
  649. /package/{skills → .agents/skills}/split-pr/scripts/split_pr_layer_order.py +0 -0
  650. /package/{skills → .agents/skills}/split-pr/scripts/split_pr_paginate.py +0 -0
  651. /package/{skills → .agents/skills}/split-pr/scripts/split_pr_process_runner.py +0 -0
  652. /package/{skills → .agents/skills}/split-pr/scripts/split_pr_script_types.py +0 -0
  653. /package/{skills → .agents/skills}/split-pr/scripts/split_pr_title.py +0 -0
  654. /package/{skills → .agents/skills}/split-pr/scripts/test_analyze_pr.py +0 -0
  655. /package/{skills → .agents/skills}/split-pr/scripts/test_categorize_files.py +0 -0
  656. /package/{skills → .agents/skills}/split-pr/scripts/test_categorize_files_packing.py +0 -0
  657. /package/{skills → .agents/skills}/split-pr/scripts/test_execute_split_slices.py +0 -0
  658. /package/{skills → .agents/skills}/split-pr/scripts/test_split_pr_dependency_graph.py +0 -0
  659. /package/{skills → .agents/skills}/split-pr/scripts/test_split_pr_git_operations.py +0 -0
  660. /package/{skills → .agents/skills}/split-pr/scripts/test_split_pr_layer_order.py +0 -0
  661. /package/{skills → .agents/skills}/split-pr/scripts/test_split_pr_paginate.py +0 -0
  662. /package/{skills → .agents/skills}/split-pr/scripts/test_split_pr_script_types.py +0 -0
  663. /package/{skills → .agents/skills}/split-pr/scripts/test_split_pr_title.py +0 -0
  664. /package/{skills → .agents/skills}/split-pr/scripts/test_verify_dependency_graph.py +0 -0
  665. /package/{skills → .agents/skills}/split-pr/scripts/test_verify_plan.py +0 -0
  666. /package/{skills → .agents/skills}/split-pr/scripts/test_verify_plan_contract.py +0 -0
  667. /package/{skills → .agents/skills}/split-pr/scripts/test_verify_plan_path_normalization.py +0 -0
  668. /package/{skills → .agents/skills}/split-pr/scripts/verify_dependency_graph.py +0 -0
  669. /package/{skills → .agents/skills}/split-pr/scripts/verify_plan.py +0 -0
  670. /package/{skills → .agents/skills}/task-build/AGENTS.md +0 -0
  671. /package/{skills → .agents/skills}/task-build/SKILL.md +0 -0
  672. /package/{skills → .agents/skills}/task-build/reference/tool-routing.md +0 -0
  673. /package/{skills → .agents/skills}/team-advisor/SKILL.md +0 -0
  674. /package/{skills → .agents/skills}/team-advisor/reference/advisor-docs-review.md +0 -0
  675. /package/{skills → .agents/skills}/update/AGENTS.md +0 -0
  676. /package/{skills → .agents/skills}/update/SKILL.md +0 -0
  677. /package/{skills → .agents/skills}/usage-pause/SKILL.md +0 -0
  678. /package/{skills → .agents/skills}/usage-pause/scripts/resolve_usage_window.py +0 -0
  679. /package/{skills → .agents/skills}/usage-pause/scripts/test_resolve_usage_window.py +0 -0
  680. /package/{skills → .agents/skills}/usage-pause/scripts/usage_pause_constants/__init__.py +0 -0
  681. /package/{skills → .agents/skills}/usage-pause/scripts/usage_pause_constants/resolve_usage_window_constants.py +0 -0
@@ -176,6 +176,15 @@ test('CONTENT_DIRECTORIES includes _shared so installer copies _shared/pr-loop/
176
176
  });
177
177
 
178
178
 
179
+ test('CONTENT_DIRECTORIES omits agents because that tree installs to the agents home', () => {
180
+ assert.equal(
181
+ CONTENT_DIRECTORIES.includes('agents'),
182
+ false,
183
+ 'agents copies into ~/.agents/agents; ~/.claude/agents is the lookup pointer',
184
+ );
185
+ });
186
+
187
+
179
188
  test('core includeDirectories ships _shared and scripts for advisor protocol and CLI fallback', () => {
180
189
  assert.ok(
181
190
  CORE_INCLUDE_DIRECTORIES.includes('_shared'),
@@ -1281,25 +1290,59 @@ const README_BASENAME_PATTERN = /^readme\.md$/i;
1281
1290
 
1282
1291
 
1283
1292
  /**
1284
- * Build a sandbox holding an installed skills root and a run backup root.
1293
+ * Build a sandbox holding one installed managed root and a run backup root.
1285
1294
  *
1286
- * @param {object} installedFiles Forward-slash relative paths under the skills root mapped to contents.
1287
- * @returns {{root: string, skillsRoot: string, backupRoot: string}} The sandbox paths.
1295
+ * @param {object} installedFiles Forward-slash relative paths under the installed root mapped to contents.
1296
+ * @param {string} [managedRootName] The managed top-level directory the files sit under.
1297
+ * @returns {{root: string, skillsRoot: string, installedRoot: string, backupRoot: string}} The sandbox paths.
1288
1298
  */
1289
- function createStalePruneSandbox(installedFiles) {
1299
+ function createStalePruneSandbox(installedFiles, managedRootName = 'skills') {
1290
1300
  const root = mkdtempSync(join(tmpdir(), 'cdev-stale-prune-'));
1291
- const skillsRoot = join(root, 'skills');
1301
+ const installedRoot = join(root, managedRootName);
1292
1302
  const backupRoot = join(root, 'pruned', 'run-timestamp');
1293
- mkdirSync(skillsRoot, { recursive: true });
1303
+ mkdirSync(installedRoot, { recursive: true });
1294
1304
  for (const [relativePath, contents] of Object.entries(installedFiles)) {
1295
- const targetPath = join(skillsRoot, relativePath);
1305
+ const targetPath = join(installedRoot, relativePath);
1296
1306
  mkdirSync(dirname(targetPath), { recursive: true });
1297
1307
  writeFileSync(targetPath, contents);
1298
1308
  }
1299
- return { root, skillsRoot, backupRoot };
1309
+ return { root, skillsRoot: installedRoot, installedRoot, backupRoot };
1300
1310
  }
1301
1311
 
1302
1312
 
1313
+ test('pruneStaleInstalledFiles leaves a retained unmanaged path the package stopped shipping in place', () => {
1314
+ const sandbox = createStalePruneSandbox({
1315
+ 'profile-isolation-launchers/config/mcp-bundles.json': '{"schemaVersion":1}\n',
1316
+ 'sync-to-cursor.py': 'print("shipped")\n',
1317
+ }, 'scripts');
1318
+ try {
1319
+ const shippedFilePath = join(sandbox.installedRoot, 'sync-to-cursor.py');
1320
+ const retainedFilePath = join(
1321
+ sandbox.installedRoot, 'profile-isolation-launchers', 'config', 'mcp-bundles.json',
1322
+ );
1323
+
1324
+ const pruneOutcome = pruneStaleInstalledFiles(
1325
+ [shippedFilePath, retainedFilePath],
1326
+ [shippedFilePath],
1327
+ sandbox.installedRoot,
1328
+ sandbox.backupRoot,
1329
+ { managedHomeDirectory: sandbox.root },
1330
+ );
1331
+
1332
+ assert.equal(pruneOutcome.prunedCount, 0, 'a retained unmanaged path never counts as pruned');
1333
+ assert.deepEqual(pruneOutcome.failedPaths, [], 'skipping a retained path reports no failed move');
1334
+ assert.equal(
1335
+ existsSync(retainedFilePath),
1336
+ true,
1337
+ 'the launcher file a prior install recorded stays where the live launcher reads it',
1338
+ );
1339
+ assert.equal(existsSync(shippedFilePath), true, 'a file this run wrote stays in place');
1340
+ } finally {
1341
+ rmSync(sandbox.root, { recursive: true, force: true });
1342
+ }
1343
+ });
1344
+
1345
+
1303
1346
  /**
1304
1347
  * Run a callable with console.warn captured, returning its value and the warnings.
1305
1348
  *
@@ -0,0 +1,175 @@
1
+ /**
2
+ * Publish a Claude Code lookup path as a directory pointer to the agents home.
3
+ *
4
+ * Skills and agents live under the agents home. Claude Code still discovers
5
+ * them at `managedRoot/skills` and `managedRoot/agents`, so the installer
6
+ * writes those two paths as directory pointers (a POSIX symlink, or a Windows
7
+ * junction). One helper owns the create, refresh, and relocate steps.
8
+ */
9
+
10
+ import {
11
+ existsSync,
12
+ lstatSync,
13
+ mkdirSync,
14
+ readlinkSync,
15
+ readdirSync,
16
+ renameSync,
17
+ rmSync,
18
+ symlinkSync,
19
+ unlinkSync,
20
+ } from 'node:fs';
21
+ import { dirname, join, resolve } from 'node:path';
22
+ import { normalizePathForComparison } from './resolve-install-root.mjs';
23
+
24
+ export const DIRECTORY_POINTER_TYPE_JUNCTION = 'junction';
25
+ export const DIRECTORY_POINTER_TYPE_DIR = 'dir';
26
+ export const POINTER_ACTION_ALREADY_POINTING = 'already-pointing';
27
+ export const POINTER_ACTION_CREATED = 'created';
28
+
29
+ /**
30
+ * Directory-pointer type this host uses.
31
+ *
32
+ * Windows receives a junction so the pointer works without Developer Mode.
33
+ * POSIX receives a directory symlink.
34
+ *
35
+ * @param {string} [platform]
36
+ * @returns {typeof DIRECTORY_POINTER_TYPE_JUNCTION | typeof DIRECTORY_POINTER_TYPE_DIR}
37
+ */
38
+ export function directoryPointerTypeForPlatform(platform = process.platform) {
39
+ return platform === 'win32'
40
+ ? DIRECTORY_POINTER_TYPE_JUNCTION
41
+ : DIRECTORY_POINTER_TYPE_DIR;
42
+ }
43
+
44
+ /**
45
+ * Report whether pointerPath is a directory pointer whose target is targetPath.
46
+ *
47
+ * @param {string} pointerPath
48
+ * @param {string} targetPath
49
+ * @returns {boolean}
50
+ */
51
+ export function isDirectoryPointerTo(pointerPath, targetPath) {
52
+ const pathKind = readPathKind(pointerPath);
53
+ if (pathKind !== 'symlink') {
54
+ return false;
55
+ }
56
+ const linkTarget = readlinkSync(pointerPath);
57
+ const resolvedLinkTarget = resolve(dirname(pointerPath), linkTarget);
58
+ return normalizePathForComparison(resolvedLinkTarget)
59
+ === normalizePathForComparison(resolve(targetPath));
60
+ }
61
+
62
+ /**
63
+ * Make pointerPath a directory pointer to targetPath.
64
+ *
65
+ * A real directory already sitting at the lookup path is merged into the
66
+ * target, then the pointer is written. A pointer that already aims at the
67
+ * target is left in place.
68
+ *
69
+ * @param {string} pointerPath Claude Code lookup path (for example `~/.claude/skills`).
70
+ * @param {string} targetPath Canonical directory (for example `~/.agents/skills`).
71
+ * @param {{ pointerType?: string }} [options]
72
+ * @returns {{ action: string, pointerPath: string, targetPath: string }}
73
+ */
74
+ export function ensureDirectoryPointer(pointerPath, targetPath, options = {}) {
75
+ const pointerType = options.pointerType ?? directoryPointerTypeForPlatform();
76
+ const resolvedTarget = resolve(targetPath);
77
+ const resolvedPointer = resolve(pointerPath);
78
+ mkdirSync(resolvedTarget, { recursive: true });
79
+
80
+ if (isDirectoryPointerTo(resolvedPointer, resolvedTarget)) {
81
+ return {
82
+ action: POINTER_ACTION_ALREADY_POINTING,
83
+ pointerPath: resolvedPointer,
84
+ targetPath: resolvedTarget,
85
+ };
86
+ }
87
+
88
+ const pathKind = readPathKind(resolvedPointer);
89
+ if (pathKind === 'symlink') {
90
+ unlinkSync(resolvedPointer);
91
+ } else if (pathKind === 'directory') {
92
+ mergeDirectoryContents(resolvedPointer, resolvedTarget);
93
+ rmSync(resolvedPointer, { recursive: true, force: true });
94
+ } else if (pathKind === 'file') {
95
+ throw new Error(
96
+ `Cannot publish a directory pointer: ${resolvedPointer} is a file`,
97
+ );
98
+ }
99
+
100
+ mkdirSync(dirname(resolvedPointer), { recursive: true });
101
+ symlinkSync(resolvedTarget, resolvedPointer, pointerType);
102
+ return {
103
+ action: POINTER_ACTION_CREATED,
104
+ pointerPath: resolvedPointer,
105
+ targetPath: resolvedTarget,
106
+ };
107
+ }
108
+
109
+ /**
110
+ * Remove a directory pointer when it aims at the expected target.
111
+ *
112
+ * @param {string} pointerPath
113
+ * @param {string} targetPath
114
+ * @returns {boolean} True when this call unlinked the pointer.
115
+ */
116
+ export function unlinkDirectoryPointerIfMatch(pointerPath, targetPath) {
117
+ if (!isDirectoryPointerTo(pointerPath, targetPath)) {
118
+ return false;
119
+ }
120
+ unlinkSync(pointerPath);
121
+ return true;
122
+ }
123
+
124
+ /**
125
+ * @param {string} absolutePath
126
+ * @returns {'missing' | 'symlink' | 'directory' | 'file' | 'other'}
127
+ */
128
+ function readPathKind(absolutePath) {
129
+ let stats;
130
+ try {
131
+ stats = lstatSync(absolutePath);
132
+ } catch (readError) {
133
+ if (readError && readError.code === 'ENOENT') {
134
+ return 'missing';
135
+ }
136
+ throw readError;
137
+ }
138
+ if (stats.isSymbolicLink()) {
139
+ return 'symlink';
140
+ }
141
+ if (stats.isDirectory()) {
142
+ return 'directory';
143
+ }
144
+ if (stats.isFile()) {
145
+ return 'file';
146
+ }
147
+ return 'other';
148
+ }
149
+
150
+ /**
151
+ * Move unique entries from sourceDirectory into destinationDirectory.
152
+ *
153
+ * An entry that already exists at the destination stays there. Nested
154
+ * directories merge the same way. Leftover source entries are removed by the
155
+ * caller with the source directory.
156
+ *
157
+ * @param {string} sourceDirectory
158
+ * @param {string} destinationDirectory
159
+ * @returns {void}
160
+ */
161
+ function mergeDirectoryContents(sourceDirectory, destinationDirectory) {
162
+ mkdirSync(destinationDirectory, { recursive: true });
163
+ const allEntries = readdirSync(sourceDirectory, { withFileTypes: true });
164
+ for (const eachEntry of allEntries) {
165
+ const sourceChild = join(sourceDirectory, eachEntry.name);
166
+ const destinationChild = join(destinationDirectory, eachEntry.name);
167
+ if (!existsSync(destinationChild)) {
168
+ renameSync(sourceChild, destinationChild);
169
+ continue;
170
+ }
171
+ if (eachEntry.isDirectory() && readPathKind(destinationChild) === 'directory') {
172
+ mergeDirectoryContents(sourceChild, destinationChild);
173
+ }
174
+ }
175
+ }
@@ -0,0 +1,129 @@
1
+ /**
2
+ * Real-filesystem tests for Claude lookup pointers into the agents home.
3
+ */
4
+
5
+ import { test } from 'node:test';
6
+ import { strict as assert } from 'node:assert';
7
+ import {
8
+ existsSync,
9
+ lstatSync,
10
+ mkdirSync,
11
+ mkdtempSync,
12
+ readFileSync,
13
+ realpathSync,
14
+ rmSync,
15
+ writeFileSync,
16
+ } from 'node:fs';
17
+ import { tmpdir } from 'node:os';
18
+ import { join } from 'node:path';
19
+ import {
20
+ DIRECTORY_POINTER_TYPE_DIR,
21
+ DIRECTORY_POINTER_TYPE_JUNCTION,
22
+ POINTER_ACTION_ALREADY_POINTING,
23
+ POINTER_ACTION_CREATED,
24
+ directoryPointerTypeForPlatform,
25
+ ensureDirectoryPointer,
26
+ isDirectoryPointerTo,
27
+ unlinkDirectoryPointerIfMatch,
28
+ } from './publish-directory-pointer.mjs';
29
+
30
+ function makeSandbox() {
31
+ const root = mkdtempSync(join(tmpdir(), 'cdev-pointer-'));
32
+ return {
33
+ root,
34
+ pointerPath: join(root, 'lookup', 'skills'),
35
+ targetPath: join(root, 'canonical', 'skills'),
36
+ };
37
+ }
38
+
39
+ test('directoryPointerTypeForPlatform uses a junction on Windows and a dir pointer elsewhere', () => {
40
+ assert.equal(directoryPointerTypeForPlatform('win32'), DIRECTORY_POINTER_TYPE_JUNCTION);
41
+ assert.equal(directoryPointerTypeForPlatform('linux'), DIRECTORY_POINTER_TYPE_DIR);
42
+ assert.equal(directoryPointerTypeForPlatform('darwin'), DIRECTORY_POINTER_TYPE_DIR);
43
+ });
44
+
45
+ test('ensureDirectoryPointer writes a lookup pointer whose files are the canonical files', () => {
46
+ const sandbox = makeSandbox();
47
+ try {
48
+ mkdirSync(sandbox.targetPath, { recursive: true });
49
+ const canonicalFile = join(sandbox.targetPath, 'notes.md');
50
+ writeFileSync(canonicalFile, 'canonical body\n');
51
+
52
+ const publication = ensureDirectoryPointer(sandbox.pointerPath, sandbox.targetPath);
53
+ assert.equal(publication.action, POINTER_ACTION_CREATED);
54
+ assert.equal(lstatSync(sandbox.pointerPath).isSymbolicLink(), true);
55
+ assert.equal(isDirectoryPointerTo(sandbox.pointerPath, sandbox.targetPath), true);
56
+ assert.equal(
57
+ readFileSync(join(sandbox.pointerPath, 'notes.md'), 'utf8'),
58
+ 'canonical body\n',
59
+ );
60
+ assert.equal(
61
+ realpathSync(join(sandbox.pointerPath, 'notes.md')),
62
+ realpathSync(canonicalFile),
63
+ );
64
+ } finally {
65
+ rmSync(sandbox.root, { recursive: true, force: true });
66
+ }
67
+ });
68
+
69
+ test('ensureDirectoryPointer leaves a correct pointer in place', () => {
70
+ const sandbox = makeSandbox();
71
+ try {
72
+ const firstPublication = ensureDirectoryPointer(sandbox.pointerPath, sandbox.targetPath);
73
+ assert.equal(firstPublication.action, POINTER_ACTION_CREATED);
74
+ const secondPublication = ensureDirectoryPointer(sandbox.pointerPath, sandbox.targetPath);
75
+ assert.equal(secondPublication.action, POINTER_ACTION_ALREADY_POINTING);
76
+ assert.equal(isDirectoryPointerTo(sandbox.pointerPath, sandbox.targetPath), true);
77
+ } finally {
78
+ rmSync(sandbox.root, { recursive: true, force: true });
79
+ }
80
+ });
81
+
82
+ test('ensureDirectoryPointer relocates a real lookup directory into the agents home', () => {
83
+ const sandbox = makeSandbox();
84
+ try {
85
+ mkdirSync(sandbox.pointerPath, { recursive: true });
86
+ writeFileSync(join(sandbox.pointerPath, 'personal.md'), 'user skill\n');
87
+ mkdirSync(sandbox.targetPath, { recursive: true });
88
+ writeFileSync(join(sandbox.targetPath, 'shipped.md'), 'package skill\n');
89
+
90
+ ensureDirectoryPointer(sandbox.pointerPath, sandbox.targetPath);
91
+
92
+ assert.equal(lstatSync(sandbox.pointerPath).isSymbolicLink(), true);
93
+ assert.equal(
94
+ readFileSync(join(sandbox.targetPath, 'personal.md'), 'utf8'),
95
+ 'user skill\n',
96
+ );
97
+ assert.equal(
98
+ readFileSync(join(sandbox.pointerPath, 'personal.md'), 'utf8'),
99
+ 'user skill\n',
100
+ );
101
+ assert.equal(
102
+ readFileSync(join(sandbox.pointerPath, 'shipped.md'), 'utf8'),
103
+ 'package skill\n',
104
+ );
105
+ assert.equal(existsSync(join(sandbox.targetPath, 'personal.md')), true);
106
+ } finally {
107
+ rmSync(sandbox.root, { recursive: true, force: true });
108
+ }
109
+ });
110
+
111
+ test('unlinkDirectoryPointerIfMatch removes only a pointer that aims at the expected target', () => {
112
+ const sandbox = makeSandbox();
113
+ try {
114
+ ensureDirectoryPointer(sandbox.pointerPath, sandbox.targetPath);
115
+ writeFileSync(join(sandbox.targetPath, 'kept.md'), 'kept\n');
116
+ assert.equal(
117
+ unlinkDirectoryPointerIfMatch(sandbox.pointerPath, sandbox.targetPath),
118
+ true,
119
+ );
120
+ assert.equal(existsSync(sandbox.pointerPath), false);
121
+ assert.equal(readFileSync(join(sandbox.targetPath, 'kept.md'), 'utf8'), 'kept\n');
122
+ assert.equal(
123
+ unlinkDirectoryPointerIfMatch(sandbox.pointerPath, sandbox.targetPath),
124
+ false,
125
+ );
126
+ } finally {
127
+ rmSync(sandbox.root, { recursive: true, force: true });
128
+ }
129
+ });
@@ -10,7 +10,7 @@
10
10
  */
11
11
 
12
12
  import { homedir } from 'node:os';
13
- import { join, normalize, resolve, sep } from 'node:path';
13
+ import { basename, dirname, join, normalize, resolve, sep } from 'node:path';
14
14
  import {
15
15
  MYPY_INI_FILE_NAME,
16
16
  CODEX_HOME_ENVIRONMENT_VARIABLE,
@@ -18,10 +18,13 @@ import {
18
18
  CODEX_RULES_DIRECTORY_NAME,
19
19
  DEFAULT_CURSOR_DIRECTORY_NAME,
20
20
  CURSOR_RULES_DIRECTORY_NAME,
21
+ MANAGED_SKILLS_DIRECTORY_NAME,
22
+ MANAGED_AGENTS_DIRECTORY_NAME,
21
23
  } from './install-constants.mjs';
22
24
 
23
25
  export const CLAUDE_CONFIG_DIR_ENVIRONMENT_VARIABLE = 'CLAUDE_CONFIG_DIR';
24
26
  export const DEFAULT_CLAUDE_DIRECTORY_NAME = '.claude';
27
+ export const DEFAULT_AGENTS_DIRECTORY_NAME = '.agents';
25
28
  export const MANIFEST_FILE_NAME = '.claude-dev-env-manifest.json';
26
29
 
27
30
  /**
@@ -44,9 +47,47 @@ export const MANIFEST_FILE_NAME = '.claude-dev-env-manifest.json';
44
47
  * codexRulesInstallDirectory: string,
45
48
  * cursorInstallDirectory: string,
46
49
  * cursorRulesInstallDirectory: string,
50
+ * agentsHome: string,
51
+ * skillsInstallDirectory: string,
52
+ * agentsInstallDirectory: string,
53
+ * skillsLookupDirectory: string,
54
+ * agentsLookupDirectory: string,
47
55
  * }} InstallRootResolution
48
56
  */
49
57
 
58
+ /**
59
+ * Resolve the canonical skills/agents home for one managed Claude root.
60
+ *
61
+ * When the managed root's base name is `.claude`, the agents home is the sibling
62
+ * `.agents` directory (so `~/.claude` pairs with `~/.agents`). Any other managed
63
+ * root — a named profile directory or an explicit `--target` — pairs with a
64
+ * sibling named `<root-name>.agents`, so two profile directories never share one
65
+ * agents home.
66
+ *
67
+ * @param {string} managedRoot Absolute managed Claude root.
68
+ * @returns {string} Absolute agents home.
69
+ */
70
+ export function resolveAgentsHome(managedRoot) {
71
+ const resolvedManagedRoot = resolve(managedRoot);
72
+ const parentDirectory = dirname(resolvedManagedRoot);
73
+ const managedBaseName = basename(resolvedManagedRoot);
74
+ if (isClaudeDirectoryBaseName(managedBaseName)) {
75
+ return resolve(join(parentDirectory, DEFAULT_AGENTS_DIRECTORY_NAME));
76
+ }
77
+ return resolve(join(parentDirectory, `${managedBaseName}${DEFAULT_AGENTS_DIRECTORY_NAME}`));
78
+ }
79
+
80
+ /**
81
+ * @param {string} directoryName
82
+ * @returns {boolean}
83
+ */
84
+ function isClaudeDirectoryBaseName(directoryName) {
85
+ if (process.platform === 'win32') {
86
+ return directoryName.toLowerCase() === DEFAULT_CLAUDE_DIRECTORY_NAME.toLowerCase();
87
+ }
88
+ return directoryName === DEFAULT_CLAUDE_DIRECTORY_NAME;
89
+ }
90
+
50
91
  /**
51
92
  * Resolve the managed install root and declared external destinations.
52
93
  *
@@ -92,6 +133,11 @@ export function resolveInstallRoot(options = {}) {
92
133
  const cursorRulesInstallDirectory = resolve(
93
134
  join(cursorInstallDirectory, CURSOR_RULES_DIRECTORY_NAME),
94
135
  );
136
+ const agentsHome = resolveAgentsHome(managedRoot);
137
+ const skillsInstallDirectory = join(agentsHome, MANAGED_SKILLS_DIRECTORY_NAME);
138
+ const agentsInstallDirectory = join(agentsHome, MANAGED_AGENTS_DIRECTORY_NAME);
139
+ const skillsLookupDirectory = join(managedRoot, MANAGED_SKILLS_DIRECTORY_NAME);
140
+ const agentsLookupDirectory = join(managedRoot, MANAGED_AGENTS_DIRECTORY_NAME);
95
141
  return {
96
142
  managedRoot,
97
143
  source,
@@ -99,10 +145,19 @@ export function resolveInstallRoot(options = {}) {
99
145
  manifestFilePath: join(managedRoot, MANIFEST_FILE_NAME),
100
146
  mypyIniInstallPath,
101
147
  allDeclaredExternalPaths: [mypyIniInstallPath],
102
- allDeclaredExternalDirectories: [codexRulesInstallDirectory, cursorInstallDirectory],
148
+ allDeclaredExternalDirectories: [
149
+ codexRulesInstallDirectory,
150
+ cursorInstallDirectory,
151
+ agentsHome,
152
+ ],
103
153
  codexRulesInstallDirectory,
104
154
  cursorInstallDirectory,
105
155
  cursorRulesInstallDirectory,
156
+ agentsHome,
157
+ skillsInstallDirectory,
158
+ agentsInstallDirectory,
159
+ skillsLookupDirectory,
160
+ agentsLookupDirectory,
106
161
  };
107
162
  }
108
163
 
@@ -131,8 +186,8 @@ export function isPathWithinManagedRoot(candidatePath, managedRoot) {
131
186
 
132
187
  /**
133
188
  * True when a write destination is allowed: inside the managed root, the
134
- * home-directory `.mypy.ini`, a file under the Codex rules directory, or a file
135
- * under the Cursor rules directory.
189
+ * home-directory `.mypy.ini`, a file under the Codex rules directory, a file
190
+ * under the Cursor rules directory, or a file under the agents home.
136
191
  *
137
192
  * @param {string} candidatePath
138
193
  * @param {InstallRootResolution} resolution
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Resolve a managed content directory in a package source tree.
3
+ *
4
+ * This package keeps skills and agents under `.agents/<name>/`. A dependency
5
+ * package may still keep those trees at `<package-root>/<name>/`. Callers pass
6
+ * the package root and the managed directory name (`skills` or `agents`); this
7
+ * helper returns the directory that exists.
8
+ */
9
+
10
+ import { existsSync } from 'node:fs';
11
+ import { join } from 'node:path';
12
+ import { PACKAGE_AGENTS_HOME_DIRECTORY_NAME } from './install-constants.mjs';
13
+
14
+ /**
15
+ * @param {string} sourceRoot Package root that may hold `.agents/<name>` or `<name>`.
16
+ * @param {string} directoryName Managed directory name (`skills` or `agents`).
17
+ * @returns {string} Absolute source directory to copy from.
18
+ */
19
+ export function resolvePackageManagedDirectory(sourceRoot, directoryName) {
20
+ const agentsHomeDirectory = join(
21
+ sourceRoot,
22
+ PACKAGE_AGENTS_HOME_DIRECTORY_NAME,
23
+ directoryName,
24
+ );
25
+ if (existsSync(agentsHomeDirectory)) {
26
+ return agentsHomeDirectory;
27
+ }
28
+ return join(sourceRoot, directoryName);
29
+ }
@@ -0,0 +1,97 @@
1
+ /**
2
+ * Package-source layout: skills and agents live under `.agents`, and
3
+ * `.claude/skills` / `.claude/agents` are directory pointers to that home.
4
+ */
5
+
6
+ import { test } from 'node:test';
7
+ import { strict as assert } from 'node:assert';
8
+ import {
9
+ existsSync,
10
+ lstatSync,
11
+ mkdirSync,
12
+ mkdtempSync,
13
+ realpathSync,
14
+ rmSync,
15
+ writeFileSync,
16
+ } from 'node:fs';
17
+ import { tmpdir } from 'node:os';
18
+ import { dirname, join } from 'node:path';
19
+ import { fileURLToPath } from 'node:url';
20
+ import {
21
+ MANAGED_AGENTS_DIRECTORY_NAME,
22
+ MANAGED_SKILLS_DIRECTORY_NAME,
23
+ PACKAGE_AGENTS_HOME_DIRECTORY_NAME,
24
+ } from './install-constants.mjs';
25
+ import { resolvePackageManagedDirectory } from './resolve-package-managed-directory.mjs';
26
+
27
+ const PACKAGE_ROOT = dirname(dirname(fileURLToPath(import.meta.url)));
28
+ const CANONICAL_SKILL_NAME = 'privacy-hygiene';
29
+ const CANONICAL_AGENT_FILE_NAME = 'clean-coder.md';
30
+
31
+ test('prefers the .agents tree when both layouts exist', () => {
32
+ const sourceRoot = mkdtempSync(join(tmpdir(), 'cdev-src-agents-'));
33
+ try {
34
+ const agentsHomeSkills = join(
35
+ sourceRoot, PACKAGE_AGENTS_HOME_DIRECTORY_NAME, MANAGED_SKILLS_DIRECTORY_NAME,
36
+ );
37
+ const packageRootSkills = join(sourceRoot, MANAGED_SKILLS_DIRECTORY_NAME);
38
+ mkdirSync(agentsHomeSkills, { recursive: true });
39
+ mkdirSync(packageRootSkills, { recursive: true });
40
+ writeFileSync(join(agentsHomeSkills, 'marker.txt'), 'canonical\n');
41
+ writeFileSync(join(packageRootSkills, 'marker.txt'), 'legacy\n');
42
+ assert.equal(
43
+ resolvePackageManagedDirectory(sourceRoot, MANAGED_SKILLS_DIRECTORY_NAME),
44
+ agentsHomeSkills,
45
+ );
46
+ } finally {
47
+ rmSync(sourceRoot, { recursive: true, force: true });
48
+ }
49
+ });
50
+
51
+ test('falls back to the package-root tree when .agents does not carry it', () => {
52
+ const sourceRoot = mkdtempSync(join(tmpdir(), 'cdev-src-legacy-'));
53
+ try {
54
+ const packageRootSkills = join(sourceRoot, MANAGED_SKILLS_DIRECTORY_NAME);
55
+ mkdirSync(packageRootSkills, { recursive: true });
56
+ assert.equal(
57
+ resolvePackageManagedDirectory(sourceRoot, MANAGED_SKILLS_DIRECTORY_NAME),
58
+ packageRootSkills,
59
+ );
60
+ } finally {
61
+ rmSync(sourceRoot, { recursive: true, force: true });
62
+ }
63
+ });
64
+
65
+ test('live package source keeps skills and agents under .agents with .claude pointers', () => {
66
+ const canonicalSkills = join(
67
+ PACKAGE_ROOT, PACKAGE_AGENTS_HOME_DIRECTORY_NAME, MANAGED_SKILLS_DIRECTORY_NAME,
68
+ );
69
+ const canonicalAgents = join(
70
+ PACKAGE_ROOT, PACKAGE_AGENTS_HOME_DIRECTORY_NAME, MANAGED_AGENTS_DIRECTORY_NAME,
71
+ );
72
+ const lookupSkills = join(PACKAGE_ROOT, '.claude', MANAGED_SKILLS_DIRECTORY_NAME);
73
+ const lookupAgents = join(PACKAGE_ROOT, '.claude', MANAGED_AGENTS_DIRECTORY_NAME);
74
+
75
+ assert.equal(
76
+ resolvePackageManagedDirectory(PACKAGE_ROOT, MANAGED_SKILLS_DIRECTORY_NAME),
77
+ canonicalSkills,
78
+ );
79
+ assert.equal(
80
+ resolvePackageManagedDirectory(PACKAGE_ROOT, MANAGED_AGENTS_DIRECTORY_NAME),
81
+ canonicalAgents,
82
+ );
83
+ assert.equal(
84
+ existsSync(join(canonicalSkills, CANONICAL_SKILL_NAME, 'SKILL.md')),
85
+ true,
86
+ );
87
+ assert.equal(
88
+ existsSync(join(canonicalAgents, CANONICAL_AGENT_FILE_NAME)),
89
+ true,
90
+ );
91
+ assert.equal(existsSync(join(PACKAGE_ROOT, MANAGED_SKILLS_DIRECTORY_NAME)), false);
92
+ assert.equal(existsSync(join(PACKAGE_ROOT, MANAGED_AGENTS_DIRECTORY_NAME)), false);
93
+ assert.equal(lstatSync(lookupSkills).isSymbolicLink(), true);
94
+ assert.equal(lstatSync(lookupAgents).isSymbolicLink(), true);
95
+ assert.equal(realpathSync(lookupSkills), realpathSync(canonicalSkills));
96
+ assert.equal(realpathSync(lookupAgents), realpathSync(canonicalAgents));
97
+ });
@@ -49,6 +49,7 @@ from observability.prose_matcher_advisory import emit_advisory_candidate # noqa
49
49
  PLUGIN_ROOT = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
50
50
 
51
51
  RESEARCH_MODE_SKILL_SEARCH_PATHS = [
52
+ os.path.join(PLUGIN_ROOT, ".agents", "skills", "research-mode", "SKILL.md"),
52
53
  os.path.join(PLUGIN_ROOT, "skills", "research-mode", "SKILL.md"),
53
54
  os.path.join(os.path.expanduser("~"), ".claude", "skills", "research-mode", "SKILL.md"),
54
55
  os.path.join(os.path.expanduser("~"), ".claude", "plugins", "marketplaces", "claude-deep-research", "skills", "research-mode", "SKILL.md"),
@@ -25,6 +25,7 @@ if _hooks_dir not in sys.path:
25
25
  from hooks_constants.hook_block_logger import log_hook_block # noqa: E402
26
26
  from hooks_constants.orchestrator_refresh_reschedule_gate_constants import ( # noqa: E402
27
27
  ALL_HOME_SKILLS_RELATIVE_PARTS,
28
+ ALL_PACKAGE_AGENTS_SKILL_SCRIPTS_RELATIVE_PARTS,
28
29
  ALL_SCHEDULE_TOOL_NAMES,
29
30
  ALL_SKILL_SCRIPTS_RELATIVE_PARTS,
30
31
  CALLING_HOOK_NAME,
@@ -51,14 +52,17 @@ def _candidate_skill_script_directories() -> list[Path]:
51
52
  """
52
53
  all_candidates: list[Path] = []
53
54
  plugin_root = os.environ.get(PLUGIN_ROOT_ENV_VAR)
55
+ relative_skill_script_layouts = (
56
+ ALL_PACKAGE_AGENTS_SKILL_SCRIPTS_RELATIVE_PARTS,
57
+ ALL_SKILL_SCRIPTS_RELATIVE_PARTS,
58
+ )
54
59
  if plugin_root:
55
- all_candidates.append(
56
- Path(plugin_root).joinpath(*ALL_SKILL_SCRIPTS_RELATIVE_PARTS)
57
- )
60
+ plugin_root_path = Path(plugin_root)
61
+ for each_relative_parts in relative_skill_script_layouts:
62
+ all_candidates.append(plugin_root_path.joinpath(*each_relative_parts))
58
63
  package_hooks_parent = Path(__file__).resolve().parents[2]
59
- all_candidates.append(
60
- package_hooks_parent.joinpath(*ALL_SKILL_SCRIPTS_RELATIVE_PARTS)
61
- )
64
+ for each_relative_parts in relative_skill_script_layouts:
65
+ all_candidates.append(package_hooks_parent.joinpath(*each_relative_parts))
62
66
  all_candidates.append(Path.home().joinpath(*ALL_HOME_SKILLS_RELATIVE_PARTS))
63
67
  return all_candidates
64
68
 
@@ -79,7 +79,7 @@ def test_ignores_single_word_command_literal() -> None:
79
79
 
80
80
 
81
81
  def test_ignores_file_outside_hooks_blocking() -> None:
82
- other_path = "packages/claude-dev-env/skills/thing/helper.py"
82
+ other_path = "packages/claude-dev-env/.agents/skills/thing/helper.py"
83
83
  assert check_unanchored_command_dispatch(UNANCHORED_SOURCE, other_path) == []
84
84
 
85
85