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
@@ -0,0 +1,186 @@
1
+ /**
2
+ * End-to-end install layout: skills and agents live under the agents home,
3
+ * and the Claude lookup paths are directory pointers to that home.
4
+ */
5
+
6
+ import { test } from 'node:test';
7
+ import { strict as assert } from 'node:assert';
8
+ import { execFileSync } from 'node:child_process';
9
+ import {
10
+ existsSync,
11
+ lstatSync,
12
+ mkdirSync,
13
+ mkdtempSync,
14
+ readFileSync,
15
+ realpathSync,
16
+ rmSync,
17
+ writeFileSync,
18
+ } from 'node:fs';
19
+ import { tmpdir } from 'node:os';
20
+ import { dirname, join } from 'node:path';
21
+ import { fileURLToPath } from 'node:url';
22
+ import { CONTENT_DIRECTORIES } from './install.mjs';
23
+ import {
24
+ MANAGED_AGENTS_DIRECTORY_NAME,
25
+ MANAGED_SKILLS_DIRECTORY_NAME,
26
+ } from './install-constants.mjs';
27
+ import { isDirectoryPointerTo } from './publish-directory-pointer.mjs';
28
+
29
+ const THIS_DIRECTORY = dirname(fileURLToPath(import.meta.url));
30
+ const INSTALLER_PATH = join(THIS_DIRECTORY, 'install.mjs');
31
+ const PACKAGE_DIRECTORY = dirname(THIS_DIRECTORY);
32
+ const SHIPPED_SKILL_NAME = 'privacy-hygiene';
33
+ const SHIPPED_AGENT_FILE_NAME = 'clean-coder.md';
34
+ const PERSONAL_SKILL_NAME = 'my-notes';
35
+
36
+ /**
37
+ * @param {string} homeDirectory
38
+ * @param {string[]} extraArguments
39
+ * @returns {string}
40
+ */
41
+ function runInstaller(homeDirectory, extraArguments) {
42
+ return execFileSync('node', [INSTALLER_PATH, ...extraArguments], {
43
+ cwd: PACKAGE_DIRECTORY,
44
+ encoding: 'utf8',
45
+ env: {
46
+ ...process.env,
47
+ HOME: homeDirectory,
48
+ USERPROFILE: homeDirectory,
49
+ GIT_CONFIG_GLOBAL: join(homeDirectory, '.gitconfig'),
50
+ CODEX_HOME: join(homeDirectory, '.codex'),
51
+ },
52
+ });
53
+ }
54
+
55
+ test('CONTENT_DIRECTORIES omits agents because that tree installs to the agents home', () => {
56
+ assert.equal(CONTENT_DIRECTORIES.includes(MANAGED_AGENTS_DIRECTORY_NAME), false);
57
+ });
58
+
59
+ test('a full install writes skills and agents under .agents and points .claude at them', () => {
60
+ const homeDirectory = mkdtempSync(join(tmpdir(), 'cdev-agents-home-'));
61
+ const claudeHome = join(homeDirectory, '.claude');
62
+ const agentsHome = join(homeDirectory, '.agents');
63
+ const skillsInstallDirectory = join(agentsHome, MANAGED_SKILLS_DIRECTORY_NAME);
64
+ const agentsInstallDirectory = join(agentsHome, MANAGED_AGENTS_DIRECTORY_NAME);
65
+ const skillsLookupDirectory = join(claudeHome, MANAGED_SKILLS_DIRECTORY_NAME);
66
+ const agentsLookupDirectory = join(claudeHome, MANAGED_AGENTS_DIRECTORY_NAME);
67
+ try {
68
+ runInstaller(homeDirectory, []);
69
+
70
+ const canonicalSkillFile = join(
71
+ skillsInstallDirectory, SHIPPED_SKILL_NAME, 'SKILL.md',
72
+ );
73
+ const lookupSkillFile = join(
74
+ skillsLookupDirectory, SHIPPED_SKILL_NAME, 'SKILL.md',
75
+ );
76
+ const canonicalAgentFile = join(agentsInstallDirectory, SHIPPED_AGENT_FILE_NAME);
77
+ const lookupAgentFile = join(agentsLookupDirectory, SHIPPED_AGENT_FILE_NAME);
78
+
79
+ assert.equal(existsSync(canonicalSkillFile), true, 'skill file lives under .agents/skills');
80
+ assert.equal(existsSync(canonicalAgentFile), true, 'agent file lives under .agents/agents');
81
+ assert.equal(lstatSync(skillsLookupDirectory).isSymbolicLink(), true);
82
+ assert.equal(lstatSync(agentsLookupDirectory).isSymbolicLink(), true);
83
+ assert.equal(
84
+ isDirectoryPointerTo(skillsLookupDirectory, skillsInstallDirectory),
85
+ true,
86
+ );
87
+ assert.equal(
88
+ isDirectoryPointerTo(agentsLookupDirectory, agentsInstallDirectory),
89
+ true,
90
+ );
91
+ assert.equal(
92
+ readFileSync(lookupSkillFile, 'utf8'),
93
+ readFileSync(canonicalSkillFile, 'utf8'),
94
+ );
95
+ assert.equal(realpathSync(lookupSkillFile), realpathSync(canonicalSkillFile));
96
+ assert.equal(
97
+ readFileSync(lookupAgentFile, 'utf8'),
98
+ readFileSync(canonicalAgentFile, 'utf8'),
99
+ );
100
+ assert.equal(realpathSync(lookupAgentFile), realpathSync(canonicalAgentFile));
101
+ assert.equal(
102
+ lstatSync(skillsInstallDirectory).isSymbolicLink(),
103
+ false,
104
+ 'the agents-home skills directory is a real directory',
105
+ );
106
+ assert.equal(
107
+ lstatSync(agentsInstallDirectory).isSymbolicLink(),
108
+ false,
109
+ 'the agents-home agents directory is a real directory',
110
+ );
111
+ } finally {
112
+ rmSync(homeDirectory, { recursive: true, force: true });
113
+ }
114
+ });
115
+
116
+ test('a real skills directory from an older install lands in .agents and stays readable through the pointer', () => {
117
+ const homeDirectory = mkdtempSync(join(tmpdir(), 'cdev-agents-relocate-'));
118
+ const claudeHome = join(homeDirectory, '.claude');
119
+ const skillsLookupDirectory = join(claudeHome, MANAGED_SKILLS_DIRECTORY_NAME);
120
+ const personalSkillFile = join(
121
+ skillsLookupDirectory, PERSONAL_SKILL_NAME, 'notes.md',
122
+ );
123
+ try {
124
+ mkdirSync(join(skillsLookupDirectory, PERSONAL_SKILL_NAME), { recursive: true });
125
+ writeFileSync(personalSkillFile, 'keep this personal skill\n');
126
+
127
+ runInstaller(homeDirectory, []);
128
+
129
+ const canonicalPersonalFile = join(
130
+ homeDirectory, '.agents', MANAGED_SKILLS_DIRECTORY_NAME,
131
+ PERSONAL_SKILL_NAME, 'notes.md',
132
+ );
133
+ assert.equal(lstatSync(join(claudeHome, MANAGED_SKILLS_DIRECTORY_NAME)).isSymbolicLink(), true);
134
+ assert.equal(existsSync(canonicalPersonalFile), true);
135
+ assert.equal(
136
+ readFileSync(join(claudeHome, MANAGED_SKILLS_DIRECTORY_NAME, PERSONAL_SKILL_NAME, 'notes.md'), 'utf8'),
137
+ 'keep this personal skill\n',
138
+ );
139
+ assert.equal(
140
+ realpathSync(join(claudeHome, MANAGED_SKILLS_DIRECTORY_NAME, PERSONAL_SKILL_NAME, 'notes.md')),
141
+ realpathSync(canonicalPersonalFile),
142
+ );
143
+ } finally {
144
+ rmSync(homeDirectory, { recursive: true, force: true });
145
+ }
146
+ });
147
+
148
+ test('uninstall removes managed skill files from the agents home and leaves a personal skill reachable through the pointer', () => {
149
+ const homeDirectory = mkdtempSync(join(tmpdir(), 'cdev-agents-uninstall-'));
150
+ const claudeHome = join(homeDirectory, '.claude');
151
+ const skillsLookupDirectory = join(claudeHome, MANAGED_SKILLS_DIRECTORY_NAME);
152
+ try {
153
+ mkdirSync(join(skillsLookupDirectory, PERSONAL_SKILL_NAME), { recursive: true });
154
+ writeFileSync(
155
+ join(skillsLookupDirectory, PERSONAL_SKILL_NAME, 'notes.md'),
156
+ 'keep this personal skill\n',
157
+ );
158
+ runInstaller(homeDirectory, []);
159
+ runInstaller(homeDirectory, ['--uninstall']);
160
+
161
+ const shippedSkillFile = join(
162
+ homeDirectory, '.agents', MANAGED_SKILLS_DIRECTORY_NAME,
163
+ SHIPPED_SKILL_NAME, 'SKILL.md',
164
+ );
165
+ const personalSkillFile = join(
166
+ homeDirectory, '.agents', MANAGED_SKILLS_DIRECTORY_NAME,
167
+ PERSONAL_SKILL_NAME, 'notes.md',
168
+ );
169
+ assert.equal(existsSync(shippedSkillFile), false);
170
+ assert.equal(existsSync(personalSkillFile), true);
171
+ assert.equal(
172
+ isDirectoryPointerTo(
173
+ join(claudeHome, MANAGED_SKILLS_DIRECTORY_NAME),
174
+ join(homeDirectory, '.agents', MANAGED_SKILLS_DIRECTORY_NAME),
175
+ ),
176
+ true,
177
+ 'the lookup pointer stays so a personal skill remains discoverable',
178
+ );
179
+ assert.equal(
180
+ readFileSync(join(claudeHome, MANAGED_SKILLS_DIRECTORY_NAME, PERSONAL_SKILL_NAME, 'notes.md'), 'utf8'),
181
+ 'keep this personal skill\n',
182
+ );
183
+ } finally {
184
+ rmSync(homeDirectory, { recursive: true, force: true });
185
+ }
186
+ });
package/bin/install.mjs CHANGED
@@ -20,6 +20,7 @@ import {
20
20
  SKIPPED_SOURCE_FILE_EXTENSIONS,
21
21
  RUN_BACKUP_DIRECTORY_NAME_PATTERN,
22
22
  MANAGED_SKILLS_DIRECTORY_NAME,
23
+ MANAGED_AGENTS_DIRECTORY_NAME,
23
24
  MANAGED_HOOKS_DIRECTORY_NAME,
24
25
  SETTINGS_FILE_NAME,
25
26
  CODEX_RULES_PACKAGE_DIRECTORY_NAME,
@@ -31,6 +32,12 @@ import {
31
32
  parseExplicitTargetFromArgv,
32
33
  isAllowedInstallDestination,
33
34
  } from './resolve-install-root.mjs';
35
+ import {
36
+ resolvePackageManagedDirectory,
37
+ } from './resolve-package-managed-directory.mjs';
38
+ import {
39
+ ensureDirectoryPointer,
40
+ } from './publish-directory-pointer.mjs';
34
41
  import {
35
42
  parseInstallTargetSelectionFromArgv,
36
43
  resolveInstallTargets,
@@ -67,6 +74,7 @@ const INSTALL_ROOT_RESOLUTION = resolveInstallRoot({
67
74
  })(),
68
75
  });
69
76
  const CLAUDE_HOME = INSTALL_ROOT_RESOLUTION.managedRoot;
77
+ const AGENTS_HOME = INSTALL_ROOT_RESOLUTION.agentsHome;
70
78
  const MANIFEST_FILE = INSTALL_ROOT_RESOLUTION.manifestFilePath;
71
79
  const MYPY_INI_INSTALL_PATH = INSTALL_ROOT_RESOLUTION.mypyIniInstallPath;
72
80
  const PACKAGE_NAME = 'claude-dev-env';
@@ -92,18 +100,21 @@ const INSTALL_TARGET_IDENTITY = (() => {
92
100
  }
93
101
  })();
94
102
 
95
- export const CONTENT_DIRECTORIES = ['rules', 'docs', 'commands', 'agents', 'system-prompts', 'scripts', '_shared', 'audit-rubrics'];
103
+ export const CONTENT_DIRECTORIES = ['rules', 'docs', 'commands', 'system-prompts', 'scripts', '_shared', 'audit-rubrics'];
96
104
 
97
105
  /**
98
- * Every top-level directory under ~/.claude the installer writes into: the
99
- * content directories plus the two it fills through their own copy loops. The
100
- * uninstall purge walks this list to find the root a recorded file belongs to and
101
- * to drop a managed directory the purge empties, and the full-install stale-file
102
- * prune walks it to give each root its own diff.
106
+ * Every top-level lookup directory the installer writes into under ~/.claude:
107
+ * the content directories plus skills, agents, and hooks. Skills and agents
108
+ * live under the agents home; `~/.claude/skills` and `~/.claude/agents` are
109
+ * directory pointers to that home. The uninstall purge walks this list to find
110
+ * the root a recorded file belongs to and to drop a managed directory the purge
111
+ * empties, and the full-install stale-file prune walks it to give each root its
112
+ * own diff.
103
113
  */
104
114
  export const MANAGED_TOP_LEVEL_DIRECTORY_NAMES = [
105
115
  ...CONTENT_DIRECTORIES,
106
116
  MANAGED_SKILLS_DIRECTORY_NAME,
117
+ MANAGED_AGENTS_DIRECTORY_NAME,
107
118
  MANAGED_HOOKS_DIRECTORY_NAME,
108
119
  ];
109
120
 
@@ -114,6 +125,35 @@ const RETIRED_SKILL_REASON_LABEL = 'retired';
114
125
  const STALE_FILE_REASON_LABEL = 'stale';
115
126
  const MANIFEST_MANAGED_PERMISSIONS_KEY = 'managedPermissions';
116
127
 
128
+ /**
129
+ * Managed-home-relative directories this package leaves to whoever deployed
130
+ * them: it writes nothing inside them and prunes nothing out of them.
131
+ *
132
+ * `scripts/profile-isolation-launchers` is the live CLI profile launcher. Its
133
+ * executable modules are deployed from a separate source, so a payload covering
134
+ * only part of that tree left config and code out of step. This package stopped
135
+ * shipping its part, and the stale-file prune reads a path the package no longer
136
+ * writes as stale, which would move the live files aside on the next install.
137
+ * Naming the directory here keeps both halves of the tree with their owner.
138
+ */
139
+ const RETAINED_UNMANAGED_RELATIVE_PATHS = [
140
+ 'scripts/profile-isolation-launchers',
141
+ ];
142
+
143
+ /**
144
+ * Report whether a path a prior manifest recorded sits inside a directory this
145
+ * package leaves to another owner.
146
+ *
147
+ * @param {string} candidatePath The absolute path the prior manifest recorded.
148
+ * @param {string} managedHomeDirectory The managed home the relative names resolve against.
149
+ * @returns {boolean} True when the path sits inside a retained unmanaged directory.
150
+ */
151
+ function isRetainedUnmanagedPath(candidatePath, managedHomeDirectory) {
152
+ return RETAINED_UNMANAGED_RELATIVE_PATHS.some(
153
+ relativePath => isInsideDirectory(candidatePath, join(managedHomeDirectory, relativePath)),
154
+ );
155
+ }
156
+
117
157
  export const CORE_INCLUDE_DIRECTORIES = [
118
158
  'rules', 'docs', 'commands', 'agents', 'audit-rubrics', '_shared', 'scripts',
119
159
  ];
@@ -220,7 +260,10 @@ function discoverDependencyGroups() {
220
260
  description: dependencyPackageJson.description || dependencyName,
221
261
  packageRoot: dependencyRoot,
222
262
  };
223
- const skillsDirectory = join(dependencyRoot, MANAGED_SKILLS_DIRECTORY_NAME);
263
+ const skillsDirectory = resolvePackageManagedDirectory(
264
+ dependencyRoot,
265
+ MANAGED_SKILLS_DIRECTORY_NAME,
266
+ );
224
267
  if (existsSync(skillsDirectory)) {
225
268
  group.skills = readdirSync(skillsDirectory, { withFileTypes: true })
226
269
  .filter(entry => entry.isDirectory())
@@ -723,6 +766,10 @@ function owningManagedRoot(installedFilePath) {
723
766
  const managedRoot = join(CLAUDE_HOME, directoryName);
724
767
  if (isInsideDirectory(resolvedPath, managedRoot)) return managedRoot;
725
768
  }
769
+ for (const directoryName of [MANAGED_SKILLS_DIRECTORY_NAME, MANAGED_AGENTS_DIRECTORY_NAME]) {
770
+ const agentsRoot = join(AGENTS_HOME, directoryName);
771
+ if (isInsideDirectory(resolvedPath, agentsRoot)) return agentsRoot;
772
+ }
726
773
  const codexRulesDirectory = INSTALL_ROOT_RESOLUTION.codexRulesInstallDirectory;
727
774
  if (isInsideDirectory(resolvedPath, codexRulesDirectory)) return codexRulesDirectory;
728
775
  const cursorInstallDirectory = INSTALL_ROOT_RESOLUTION.cursorInstallDirectory;
@@ -730,6 +777,25 @@ function owningManagedRoot(installedFilePath) {
730
777
  return null;
731
778
  }
732
779
 
780
+ /**
781
+ * Publish `~/.claude/skills` and `~/.claude/agents` as directory pointers to
782
+ * the agents home.
783
+ *
784
+ * Skills and agents live under `~/.agents` (or the per-root agents home).
785
+ * Claude Code discovers them at the lookup paths under the managed Claude root,
786
+ * so those two paths are pointers. A real directory from an older install at a
787
+ * lookup path is merged into the agents home before the pointer is written.
788
+ *
789
+ * @returns {string[]} The two lookup paths this run published.
790
+ */
791
+ function publishSkillAndAgentLookupPointers() {
792
+ const skillsPointer = INSTALL_ROOT_RESOLUTION.skillsLookupDirectory;
793
+ const agentsPointer = INSTALL_ROOT_RESOLUTION.agentsLookupDirectory;
794
+ ensureDirectoryPointer(skillsPointer, INSTALL_ROOT_RESOLUTION.skillsInstallDirectory);
795
+ ensureDirectoryPointer(agentsPointer, INSTALL_ROOT_RESOLUTION.agentsInstallDirectory);
796
+ return [skillsPointer, agentsPointer];
797
+ }
798
+
733
799
  /**
734
800
  * Report whether a path the prior manifest recorded is still a plain file this
735
801
  * run may move.
@@ -832,6 +898,7 @@ export function pruneStaleInstalledFiles(
832
898
  const stalePath = resolve(priorFile);
833
899
  if (!isInsideDirectory(stalePath, resolvedRoot)) continue;
834
900
  if (currentFileKeys.has(comparisonKeyForPath(stalePath, options))) continue;
901
+ if (isRetainedUnmanagedPath(stalePath, managedHomeDirectory)) continue;
835
902
  if (!isMovableStaleFile(stalePath)) continue;
836
903
  const backupRelativePath = relative(resolvedRoot, stalePath);
837
904
  const didMove = moveIntoRunBackup(
@@ -1944,6 +2011,7 @@ function executeInstallPlanMutations(plan, transactionHelpers) {
1944
2011
  console.log(`\nInstalling ${PACKAGE_NAME} (${groupLabel})...\n`);
1945
2012
  console.log(` Python: ${pythonCommand}`);
1946
2013
  mkdirSync(CLAUDE_HOME, { recursive: true });
2014
+ const publishedPointerPaths = publishSkillAndAgentLookupPointers();
1947
2015
 
1948
2016
  const activeGroups = selectedGroups
1949
2017
  ? selectedGroups.map(groupName => ({ groupName, ...INSTALL_GROUPS[groupName] }))
@@ -2017,6 +2085,27 @@ function executeInstallPlanMutations(plan, transactionHelpers) {
2017
2085
  }
2018
2086
  }
2019
2087
  }
2088
+ const shouldCopyAgents = !allowedDirectories
2089
+ || allowedDirectories.has(MANAGED_AGENTS_DIRECTORY_NAME);
2090
+ if (shouldCopyAgents) {
2091
+ for (const sourceRoot of allSourceRoots) {
2092
+ const agentsSource = resolvePackageManagedDirectory(
2093
+ sourceRoot,
2094
+ MANAGED_AGENTS_DIRECTORY_NAME,
2095
+ );
2096
+ if (!existsSync(agentsSource)) continue;
2097
+ const agentsDestination = INSTALL_ROOT_RESOLUTION.agentsLookupDirectory;
2098
+ const stats = copyTree(agentsSource, agentsDestination);
2099
+ if (!summary[MANAGED_AGENTS_DIRECTORY_NAME]) {
2100
+ summary[MANAGED_AGENTS_DIRECTORY_NAME] = stats;
2101
+ } else {
2102
+ summary[MANAGED_AGENTS_DIRECTORY_NAME].created += stats.created;
2103
+ summary[MANAGED_AGENTS_DIRECTORY_NAME].updated += stats.updated;
2104
+ summary[MANAGED_AGENTS_DIRECTORY_NAME].paths.push(...stats.paths);
2105
+ }
2106
+ allInstalledFiles.push(...stats.paths);
2107
+ }
2108
+ }
2020
2109
  const shouldInstallCodexRules = !selectedGroups
2021
2110
  || activeGroups.some((eachGroup) => eachGroup.includeCodexRules);
2022
2111
  if (shouldInstallCodexRules) {
@@ -2047,7 +2136,10 @@ function executeInstallPlanMutations(plan, transactionHelpers) {
2047
2136
  const installedSkillNames = new Set();
2048
2137
  const copiedSkillNames = new Set();
2049
2138
  for (const sourceRoot of allSourceRoots) {
2050
- const skillsSource = join(sourceRoot, MANAGED_SKILLS_DIRECTORY_NAME);
2139
+ const skillsSource = resolvePackageManagedDirectory(
2140
+ sourceRoot,
2141
+ MANAGED_SKILLS_DIRECTORY_NAME,
2142
+ );
2051
2143
  if (!existsSync(skillsSource)) continue;
2052
2144
  const skillDirs = readdirSync(skillsSource, { withFileTypes: true }).filter(entry => entry.isDirectory());
2053
2145
  for (const skillDir of skillDirs) {
@@ -2066,7 +2158,7 @@ function executeInstallPlanMutations(plan, transactionHelpers) {
2066
2158
  }
2067
2159
  summary.skills = { created: skillsCreated, updated: skillsUpdated, pruned: 0, paths: skillPaths };
2068
2160
  allInstalledFiles.push(...skillPaths);
2069
- syncWrittenPaths(allInstalledFiles);
2161
+ syncWrittenPaths([...allInstalledFiles, ...publishedPointerPaths]);
2070
2162
  throwIfFault(FAULT_PHASES.AFTER_FILE_STAGING);
2071
2163
  throwIfFault(FAULT_PHASES.BEFORE_DURABLE_PROMOTION);
2072
2164
  const shouldInstallAnyHooks = shouldInstallAllHooks || (allowedHookFiles && allowedHookFiles.size > 0);
@@ -2101,7 +2193,7 @@ function executeInstallPlanMutations(plan, transactionHelpers) {
2101
2193
  console.log(` Hook files: ${totalHooksCreated} new, ${totalHooksUpdated} updated`);
2102
2194
  summary.hookGroups = totalHookGroups;
2103
2195
  console.log(` Hook groups: ${totalHookGroups} merged into settings.json`);
2104
- syncWrittenPaths(allInstalledFiles);
2196
+ syncWrittenPaths([...allInstalledFiles, ...publishedPointerPaths]);
2105
2197
  throwIfFault(FAULT_PHASES.AFTER_SETTINGS_WRITE);
2106
2198
 
2107
2199
  console.warn(
@@ -2123,7 +2215,7 @@ function executeInstallPlanMutations(plan, transactionHelpers) {
2123
2215
  console.warn(` Git hooks: ${gitHookInstallationResult.hooksPathConfigurationResult.reason}`);
2124
2216
  }
2125
2217
  console.log(` Git hook shims: ${gitHookInstallationResult.createdShimPaths.length} files (pre-commit, pre-push, post-commit)`);
2126
- syncWrittenPaths(allInstalledFiles);
2218
+ syncWrittenPaths([...allInstalledFiles, ...publishedPointerPaths]);
2127
2219
  throwIfFault(FAULT_PHASES.AFTER_GIT_CONFIG);
2128
2220
  throwIfFault(FAULT_PHASES.AFTER_LINK_PUBLICATION);
2129
2221
 
@@ -2143,7 +2235,7 @@ function executeInstallPlanMutations(plan, transactionHelpers) {
2143
2235
  console.warn(` ${mypyIniInstallResult.expectedLine}`);
2144
2236
  }
2145
2237
  } else {
2146
- syncWrittenPaths(allInstalledFiles);
2238
+ syncWrittenPaths([...allInstalledFiles, ...publishedPointerPaths]);
2147
2239
  throwIfFault(FAULT_PHASES.AFTER_SETTINGS_WRITE);
2148
2240
  throwIfFault(FAULT_PHASES.AFTER_GIT_CONFIG);
2149
2241
  throwIfFault(FAULT_PHASES.AFTER_LINK_PUBLICATION);
@@ -2162,7 +2254,7 @@ function executeInstallPlanMutations(plan, transactionHelpers) {
2162
2254
  );
2163
2255
  }
2164
2256
 
2165
- const claudeHubSource = join(PACKAGE_ROOT, 'CLAUDE.md');
2257
+ const claudeHubSource = join(PACKAGE_ROOT, '.claude', 'CLAUDE.md');
2166
2258
  if (existsSync(claudeHubSource)) {
2167
2259
  const claudeHubDest = join(CLAUDE_HOME, 'CLAUDE.md');
2168
2260
  const backupPath = backupHubBeforeOverwrite(claudeHubDest, claudeHubSource, 'CLAUDE.md');
@@ -2228,7 +2320,7 @@ function executeInstallPlanMutations(plan, transactionHelpers) {
2228
2320
  ? { deny: managedPermissionDenyEntries }
2229
2321
  : null,
2230
2322
  );
2231
- syncWrittenPaths([...allInstalledFiles, MANIFEST_FILE, plan.settingsPath]);
2323
+ syncWrittenPaths([...allInstalledFiles, MANIFEST_FILE, plan.settingsPath, ...publishedPointerPaths]);
2232
2324
  throwIfFault(FAULT_PHASES.AFTER_MANIFEST_WRITE);
2233
2325
  console.log(`\nInstalled ${PACKAGE_NAME}:`);
2234
2326
  for (const directory of CONTENT_DIRECTORIES) {
@@ -2245,6 +2337,10 @@ function executeInstallPlanMutations(plan, transactionHelpers) {
2245
2337
  const { created } = summary.cursorRules;
2246
2338
  console.log(` cursor-rules: ${created} generated files`);
2247
2339
  }
2340
+ if (summary[MANAGED_AGENTS_DIRECTORY_NAME]) {
2341
+ const { created, updated } = summary[MANAGED_AGENTS_DIRECTORY_NAME];
2342
+ console.log(` ${MANAGED_AGENTS_DIRECTORY_NAME}: ${created + updated} files (${created} new, ${updated} updated)`);
2343
+ }
2248
2344
  if (summary.skills) {
2249
2345
  const { created, updated, pruned } = summary.skills;
2250
2346
  const staleClause = pruned > 0 ? `, ${pruned} stale moved aside` : '';
@@ -2375,7 +2471,7 @@ function executeUninstallPlan(plan, helpers = {}) {
2375
2471
  }
2376
2472
  if (plan.skippedFiles.length > 0) {
2377
2473
  console.warn(
2378
- ` ${plan.skippedFiles.length} manifest record(s) skipped — each names a path outside ${CLAUDE_HOME}, outside ${MYPY_INI_INSTALL_PATH}, outside ${INSTALL_ROOT_RESOLUTION.codexRulesInstallDirectory}, and outside ${INSTALL_ROOT_RESOLUTION.cursorInstallDirectory}`,
2474
+ ` ${plan.skippedFiles.length} manifest record(s) skipped — each names a path outside ${CLAUDE_HOME}, outside ${MYPY_INI_INSTALL_PATH}, outside ${INSTALL_ROOT_RESOLUTION.codexRulesInstallDirectory}, outside ${INSTALL_ROOT_RESOLUTION.cursorInstallDirectory}, and outside ${AGENTS_HOME}`,
2379
2475
  );
2380
2476
  }
2381
2477
  throwIfFault(FAULT_PHASES.AFTER_FILE_STAGING);
@@ -2423,6 +2519,9 @@ function executeUninstallPlan(plan, helpers = {}) {
2423
2519
  }
2424
2520
  } catch { /* leave non-empty dirs */ }
2425
2521
  }
2522
+ removeEmptyDirectoryTree(INSTALL_ROOT_RESOLUTION.skillsInstallDirectory);
2523
+ removeEmptyDirectoryTree(INSTALL_ROOT_RESOLUTION.agentsInstallDirectory);
2524
+ removeEmptyDirectoryTree(AGENTS_HOME);
2426
2525
  console.log(`\nRemoved ${removed} files.\n`);
2427
2526
  return removed;
2428
2527
  }
@@ -2541,6 +2640,7 @@ Examples:
2541
2640
  npx ${PACKAGE_NAME} --profiles editor,mel --only core
2542
2641
 
2543
2642
  Install location: ~/.claude/ by default; CLAUDE_CONFIG_DIR or --target selects another managed root.
2643
+ Skills and agents live under ~/.agents (sibling of ~/.claude). ~/.claude/skills and ~/.claude/agents are directory pointers to that home.
2544
2644
  Named profiles resolve under LLM_SETTINGS_PROFILES_ROOT or ~/.claude-profiles/<directoryName>.
2545
2645
  Codex exec-policy files copy into ~/.codex/rules, or CODEX_HOME/rules when CODEX_HOME is set.
2546
2646
  Cursor rule files generate into ~/.cursor/rules as stem-named mdc files, one per Claude rule.
@@ -2590,13 +2690,15 @@ function realPathOrSelf(filesystemPath) {
2590
2690
  }
2591
2691
 
2592
2692
  /**
2593
- * Load profile id → directoryName from the A1 launcher contract when present.
2594
- * Falls back to identity mapping when the file is missing, unreadable, or empty.
2693
+ * Load profile id → directoryName for the install targets this package resolves.
2694
+ *
2695
+ * Each profile's directory carries the profile's own name, so the map is an
2696
+ * identity over the ids a multi-target install accepts.
2595
2697
  *
2596
2698
  * @returns {Record<string, string>}
2597
2699
  */
2598
2700
  function loadDirectoryNameByProfileId() {
2599
- const fallbackDirectoryNameByProfileId = {
2701
+ return {
2600
2702
  main: 'main',
2601
2703
  editor: 'editor',
2602
2704
  mel: 'mel',
@@ -2604,35 +2706,6 @@ function loadDirectoryNameByProfileId() {
2604
2706
  master: 'master',
2605
2707
  kimi: 'kimi',
2606
2708
  };
2607
- const manifestPath = join(
2608
- PACKAGE_ROOT,
2609
- 'scripts',
2610
- 'profile-isolation-launchers',
2611
- 'config',
2612
- 'profiles.manifest.json',
2613
- );
2614
- if (!existsSync(manifestPath)) {
2615
- return fallbackDirectoryNameByProfileId;
2616
- }
2617
- try {
2618
- const document = JSON.parse(readFileSync(manifestPath, 'utf8'));
2619
- /** @type {Record<string, string>} */
2620
- const directoryNameByProfileId = {};
2621
- const profiles = document && typeof document === 'object' ? document.profiles : null;
2622
- if (profiles && typeof profiles === 'object') {
2623
- for (const [eachProfileId, eachProfile] of Object.entries(profiles)) {
2624
- if (eachProfile && typeof eachProfile === 'object' && typeof eachProfile.directoryName === 'string') {
2625
- directoryNameByProfileId[eachProfileId] = eachProfile.directoryName;
2626
- }
2627
- }
2628
- }
2629
- if (Object.keys(directoryNameByProfileId).length === 0) {
2630
- return fallbackDirectoryNameByProfileId;
2631
- }
2632
- return directoryNameByProfileId;
2633
- } catch {
2634
- return fallbackDirectoryNameByProfileId;
2635
- }
2636
2709
  }
2637
2710
 
2638
2711
  /**
@@ -180,6 +180,7 @@ test('update plan marks purge and lists E2 mutation kinds; journal omits hooks',
180
180
  assert.equal(plan.shouldPurgeBeforeReinstall, true);
181
181
  const allMutations = describeInstallMutations(plan);
182
182
  assert.ok(allMutations.includes('purge_managed_installation'));
183
+ assert.ok(allMutations.includes('publish_directory_pointers'));
183
184
  assert.ok(allMutations.includes('merge_hooks_settings'));
184
185
  assert.ok(allMutations.includes('write_manifest'));
185
186
  assert.ok(Object.isFrozen(allMutations));
@@ -11,11 +11,13 @@ import { fileURLToPath } from 'node:url';
11
11
  import { CODEX_RULES_SHIPPED_FILE_NAME } from './install-constants.mjs';
12
12
  import {
13
13
  resolveInstallRoot,
14
+ resolveAgentsHome,
14
15
  isPathWithinManagedRoot,
15
16
  isAllowedInstallDestination,
16
17
  parseExplicitTargetFromArgv,
17
18
  CLAUDE_CONFIG_DIR_ENVIRONMENT_VARIABLE,
18
19
  DEFAULT_CLAUDE_DIRECTORY_NAME,
20
+ DEFAULT_AGENTS_DIRECTORY_NAME,
19
21
  } from './resolve-install-root.mjs';
20
22
 
21
23
  const BIN_DIRECTORY = fileURLToPath(new URL('.', import.meta.url));
@@ -30,6 +32,23 @@ test('default target remains join(homeDirectory, .claude)', () => {
30
32
  });
31
33
  assert.equal(resolution.managedRoot, resolve(join(homeDirectory, DEFAULT_CLAUDE_DIRECTORY_NAME)));
32
34
  assert.equal(resolution.source, 'default-home');
35
+ assert.equal(resolution.agentsHome, resolve(join(homeDirectory, DEFAULT_AGENTS_DIRECTORY_NAME)));
36
+ assert.equal(
37
+ resolution.skillsInstallDirectory,
38
+ join(resolution.agentsHome, 'skills'),
39
+ );
40
+ assert.equal(
41
+ resolution.skillsLookupDirectory,
42
+ join(resolution.managedRoot, 'skills'),
43
+ );
44
+ assert.equal(
45
+ resolution.agentsInstallDirectory,
46
+ join(resolution.agentsHome, 'agents'),
47
+ );
48
+ assert.equal(
49
+ resolution.agentsLookupDirectory,
50
+ join(resolution.managedRoot, 'agents'),
51
+ );
33
52
  });
34
53
 
35
54
  test('CLAUDE_CONFIG_DIR selects the profile root over the home default', () => {
@@ -98,6 +117,20 @@ test('declared external mypy.ini is allowed; unrelated external paths are not',
98
117
  ),
99
118
  true,
100
119
  );
120
+ assert.equal(
121
+ isAllowedInstallDestination(
122
+ join(resolution.skillsInstallDirectory, 'privacy-hygiene', 'SKILL.md'),
123
+ resolution,
124
+ ),
125
+ true,
126
+ );
127
+ assert.equal(
128
+ isAllowedInstallDestination(
129
+ join(resolution.agentsInstallDirectory, 'clean-coder.md'),
130
+ resolution,
131
+ ),
132
+ true,
133
+ );
101
134
  });
102
135
 
103
136
  test('parseExplicitTargetFromArgv reads --target and --target=', () => {
@@ -143,7 +176,27 @@ test('installer destinations for disposable main, profile-a, and profile-b stay
143
176
  isAllowedInstallDestination(resolution.mypyIniInstallPath, resolution),
144
177
  true,
145
178
  );
179
+ assert.equal(
180
+ isAllowedInstallDestination(
181
+ join(resolution.skillsInstallDirectory, 'fixture-skill', 'SKILL.md'),
182
+ resolution,
183
+ ),
184
+ true,
185
+ `${eachProfileId}: skills install directory is an allowed destination`,
186
+ );
187
+ assert.equal(
188
+ resolution.agentsHome,
189
+ resolveAgentsHome(profileRoot),
190
+ );
191
+ assert.notEqual(
192
+ resolution.agentsHome,
193
+ resolve(join(homeDirectory, DEFAULT_AGENTS_DIRECTORY_NAME)),
194
+ `${eachProfileId}: a profile root keeps its own agents home`,
195
+ );
146
196
  }
197
+ const profileAHome = resolveAgentsHome(join(runRoot, 'profile-a'));
198
+ const profileBHome = resolveAgentsHome(join(runRoot, 'profile-b'));
199
+ assert.notEqual(profileAHome, profileBHome);
147
200
  } finally {
148
201
  rmSync(runRoot, { recursive: true, force: true });
149
202
  }