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.
- package/.agents/agents/.claude/CLAUDE.md +1 -0
- package/{agents → .agents/agents}/AGENTS.md +2 -2
- package/{agents → .agents/agents}/test_agent_frontmatter.py +1 -1
- package/.agents/skills/.claude/CLAUDE.md +1 -0
- package/{skills → .agents/skills}/AGENTS.md +2 -2
- package/.agents/skills/_shared/.claude/CLAUDE.md +1 -0
- package/{skills → .agents/skills}/_shared/AGENTS.md +2 -2
- package/.agents/skills/_shared/advisor/.claude/CLAUDE.md +1 -0
- package/.agents/skills/_shared/pr-loop/.claude/CLAUDE.md +1 -0
- package/.agents/skills/_shared/pr-loop/prompts/.claude/CLAUDE.md +1 -0
- package/.agents/skills/_shared/pr-loop/scripts/.claude/CLAUDE.md +1 -0
- package/.agents/skills/_shared/pr-loop/scripts/skills_pr_loop_constants/.claude/CLAUDE.md +1 -0
- package/{skills → .agents/skills}/_shared/pr-loop/scripts/skills_pr_loop_constants/audit_category_schema_constants.py +6 -1
- package/{skills → .agents/skills}/_shared/pr-loop/scripts/test_build_audit_prompt.py +9 -3
- package/{skills → .agents/skills}/_shared/pr-loop/scripts/write_audit_outcomes.py +1 -1
- package/{skills → .agents/skills}/_shared/pr-loop/scripts/write_fix_outcomes.py +1 -1
- package/.agents/skills/anthropic-plan/.claude/CLAUDE.md +1 -0
- package/{skills → .agents/skills}/anthropic-plan/AGENTS.md +1 -1
- package/.agents/skills/anthropic-plan/scripts/.claude/CLAUDE.md +1 -0
- package/.agents/skills/anthropic-plan/scripts/anthropic_plan_scripts_constants/.claude/CLAUDE.md +1 -0
- package/.agents/skills/anthropic-plan/templates/.claude/CLAUDE.md +1 -0
- package/{skills → .agents/skills}/anthropic-plan/test_skill_contract.py +4 -4
- package/.agents/skills/anthropic-plan/workflow/.claude/CLAUDE.md +1 -0
- package/.agents/skills/auditing-claude-config/.claude/CLAUDE.md +1 -0
- package/.agents/skills/autoconverge/.claude/CLAUDE.md +1 -0
- package/.agents/skills/autoconverge/reference/.claude/CLAUDE.md +1 -0
- package/.agents/skills/autoconverge/workflow/.claude/CLAUDE.md +1 -0
- package/.agents/skills/autoconverge/workflow/autoconverge_report_constants/.claude/CLAUDE.md +1 -0
- package/.agents/skills/bugteam/.claude/CLAUDE.md +1 -0
- package/.agents/skills/bugteam/reference/.claude/CLAUDE.md +1 -0
- package/.agents/skills/bugteam/reference/obstacles/.claude/CLAUDE.md +1 -0
- package/.agents/skills/bugteam/scripts/.claude/CLAUDE.md +1 -0
- package/{skills → .agents/skills}/bugteam/scripts/bugteam_code_rules_gate.py +11 -1
- package/{skills → .agents/skills}/bugteam/scripts/bugteam_fix_hookspath.py +11 -1
- package/{skills → .agents/skills}/bugteam/scripts/bugteam_preflight.py +11 -1
- package/.agents/skills/bugteam/scripts/bugteam_scripts_constants/.claude/CLAUDE.md +1 -0
- package/{skills → .agents/skills}/bugteam/scripts/reflow_skill_md.py +3 -3
- package/.agents/skills/codex-review/.claude/CLAUDE.md +1 -0
- package/.agents/skills/codex-review/reference/.claude/CLAUDE.md +1 -0
- package/.agents/skills/codex-review/scripts/codex_review_scripts_constants/.claude/CLAUDE.md +1 -0
- package/{skills → .agents/skills}/codex-review/scripts/codex_usage_probe.py +11 -1
- package/{skills → .agents/skills}/codex-review/scripts/run_codex_review.py +11 -1
- package/{skills → .agents/skills}/codex-review/test_skill_scaffold.py +4 -4
- package/.agents/skills/copilot-review/.claude/CLAUDE.md +1 -0
- package/{skills → .agents/skills}/e-code-review/reference/effort-evaluation.md +1 -1
- package/.agents/skills/everything-search/.claude/CLAUDE.md +1 -0
- package/.agents/skills/fresh-branch/.claude/CLAUDE.md +1 -0
- package/.agents/skills/grok-spawn/.claude/CLAUDE.md +1 -0
- package/{skills → .agents/skills}/grokify/evals/README.md +1 -1
- package/.agents/skills/pr-converge/.claude/CLAUDE.md +1 -0
- package/.agents/skills/pr-converge/pr_converge_skill_constants/.claude/CLAUDE.md +1 -0
- package/{skills → .agents/skills}/pr-converge/pr_converge_skill_constants/AGENTS.md +1 -1
- package/{skills → .agents/skills}/pr-converge/pr_converge_skill_constants/constants.py +1 -1
- package/.agents/skills/pr-converge/reference/.claude/CLAUDE.md +1 -0
- package/.agents/skills/pr-converge/reference/obstacles/.claude/CLAUDE.md +1 -0
- package/.agents/skills/pr-converge/scripts/.claude/CLAUDE.md +1 -0
- package/{skills → .agents/skills}/pr-converge/scripts/_pr_converge_path_setup.py +17 -2
- package/.agents/skills/pr-converge/scripts/pr_converge_scripts_constants/.claude/CLAUDE.md +1 -0
- package/{skills → .agents/skills}/pr-converge/scripts/reflow_skill_md.py +2 -2
- package/{skills → .agents/skills}/pr-converge/scripts/test__pr_converge_path_setup.py +7 -4
- package/.agents/skills/pr-converge/workflows/.claude/CLAUDE.md +1 -0
- package/{skills → .agents/skills}/prototype/scripts/test_probe_sandbox_safety.py +1 -1
- package/.agents/skills/rebase/.claude/CLAUDE.md +1 -0
- package/.agents/skills/recall/.claude/CLAUDE.md +1 -0
- package/.agents/skills/remember/.claude/CLAUDE.md +1 -0
- package/.agents/skills/run-claude-dev-env/SKILL.md +84 -0
- package/.agents/skills/run-claude-dev-env/driver.mjs +239 -0
- package/.agents/skills/session-log/.claude/CLAUDE.md +1 -0
- package/.agents/skills/session-tidy/.claude/CLAUDE.md +1 -0
- package/.agents/skills/skill-builder/.claude/CLAUDE.md +1 -0
- package/.agents/skills/skill-builder/references/.claude/CLAUDE.md +1 -0
- package/{skills → .agents/skills}/skill-builder/references/deterministic-elements.md +1 -1
- package/.agents/skills/skill-builder/templates/.claude/CLAUDE.md +1 -0
- package/.agents/skills/skill-builder/workflows/.claude/CLAUDE.md +1 -0
- package/{skills → .agents/skills}/split-pr/reference/proposal-format.md +1 -1
- package/.agents/skills/task-build/.claude/CLAUDE.md +1 -0
- package/.agents/skills/update/.claude/CLAUDE.md +1 -0
- package/.claude/CLAUDE.md +1 -0
- package/_shared/advisor/reference/sol-rung.md +1 -1
- package/_shared/advisor/scripts/tests/test_codex_sol_advisor.py +1 -1
- package/_shared/advisor/scripts/tier_model_ids.py +6 -2
- package/_shared/pr-loop/code-rules-gate.md +1 -1
- package/bin/AGENTS.md +17 -12
- package/bin/ever-shipped-skills.mjs +5 -2
- package/bin/install-constants.mjs +31 -6
- package/bin/install-plan.mjs +6 -1
- package/bin/install.agents-home.test.mjs +186 -0
- package/bin/install.mjs +120 -47
- package/bin/install.plan.test.mjs +1 -0
- package/bin/install.profile-root.test.mjs +53 -0
- package/bin/install.test.mjs +51 -8
- package/bin/publish-directory-pointer.mjs +175 -0
- package/bin/publish-directory-pointer.test.mjs +129 -0
- package/bin/resolve-install-root.mjs +59 -4
- package/bin/resolve-package-managed-directory.mjs +29 -0
- package/bin/resolve-package-managed-directory.test.mjs +97 -0
- package/hooks/blocking/hedging_language_blocker.py +1 -0
- package/hooks/blocking/orchestrator_refresh_reschedule_gate.py +10 -6
- package/hooks/blocking/test_code_rules_command_dispatch.py +1 -1
- package/hooks/blocking/test_code_rules_enforcer_magic_slice_bounds.py +1 -1
- package/hooks/blocking/test_code_rules_enforcer_split_annotations_length.py +1 -1
- package/hooks/blocking/test_code_rules_js_conventions.py +1 -1
- package/hooks/blocking/test_code_rules_js_resume_task_enumeration.py +1 -1
- package/hooks/blocking/test_code_rules_js_returns_object_schemaless.py +1 -1
- package/hooks/blocking/test_code_rules_js_sibling_return_object_key_drift.py +1 -1
- package/hooks/blocking/test_duplicate_rmtree_helper_blocker.py +1 -1
- package/hooks/blocking/test_fable_spawn_gate.py +1 -1
- package/hooks/blocking/test_orchestrator_refresh_reschedule_gate.py +1 -1
- package/hooks/hooks_constants/orchestrator_refresh_reschedule_gate_constants.py +9 -0
- package/installable-surfaces.manifest.json +2 -3
- package/package.json +4 -5
- package/scripts/AGENTS.md +0 -7
- package/scripts/active_capability_references.py +38 -8
- package/scripts/claude_chain_runner.py +49 -2
- package/scripts/claude_chain_usage.py +2 -0
- package/scripts/codex_compat_watcher.py +1 -1
- package/scripts/dev_env_scripts_constants/active_capability_constants.py +5 -2
- package/scripts/dev_env_scripts_constants/claude_chain_usage_constants.py +4 -1
- package/scripts/invoke_code_review.py +48 -51
- package/scripts/resolve_worker_spawn.py +42 -47
- package/scripts/test_claude_chain_runner.py +28 -0
- package/scripts/test_dispatcher_profile_import.py +184 -0
- package/scripts/test_resolve_worker_spawn.py +119 -1
- package/scripts/test_validate_instruction_pairs.py +30 -0
- package/scripts/test_verify_installable_package.py +2 -1
- package/scripts/tests/test_codex_compat_watcher.py +5 -5
- package/CLAUDE.md +0 -1
- package/agents/CLAUDE.md +0 -1
- package/scripts/profile-isolation-launchers/config/mcp-bundles.json +0 -25
- package/scripts/profile-isolation-launchers/config/profile-isolation-constants.mjs +0 -60
- package/scripts/profile-isolation-launchers/config/profiles.manifest.json +0 -54
- package/scripts/profile-isolation-launchers/config/shared-allowlist.json +0 -64
- package/scripts/profile-isolation-launchers/launcher-runtime.mjs +0 -180
- package/scripts/profile-isolation-launchers/lib/profile-manifest.mjs +0 -288
- package/scripts/profile-isolation-launchers/mcp-bundles.mjs +0 -275
- package/scripts/profile-isolation-launchers/profile-isolation-contract.test.mjs +0 -221
- package/scripts/profile-isolation-launchers/tests/launcher-runtime.test.mjs +0 -108
- package/scripts/profile-isolation-launchers/tests/mcp-bundles.test.mjs +0 -147
- package/scripts/profile-isolation-launchers/tests/shortcut-contract.test.ps1 +0 -102
- package/scripts/profile-isolation-launchers/tests/version-compatibility.test.mjs +0 -210
- package/scripts/profile-isolation-launchers/version-compatibility.mjs +0 -299
- package/scripts/profile-isolation-launchers/windows/shortcut-inventory.ps1 +0 -127
- package/scripts/profile-isolation-launchers/windows/shortcut-manifest.json +0 -51
- package/scripts/profile-isolation-launchers/windows/shortcut-reconcile.ps1 +0 -77
- package/skills/CLAUDE.md +0 -1
- package/skills/_shared/CLAUDE.md +0 -1
- package/skills/_shared/advisor/CLAUDE.md +0 -1
- package/skills/_shared/pr-loop/CLAUDE.md +0 -1
- package/skills/_shared/pr-loop/prompts/CLAUDE.md +0 -1
- package/skills/_shared/pr-loop/scripts/CLAUDE.md +0 -1
- package/skills/_shared/pr-loop/scripts/skills_pr_loop_constants/CLAUDE.md +0 -1
- package/skills/anthropic-plan/CLAUDE.md +0 -1
- package/skills/anthropic-plan/scripts/CLAUDE.md +0 -1
- package/skills/anthropic-plan/scripts/anthropic_plan_scripts_constants/CLAUDE.md +0 -1
- package/skills/anthropic-plan/templates/CLAUDE.md +0 -1
- package/skills/anthropic-plan/workflow/CLAUDE.md +0 -1
- package/skills/auditing-claude-config/CLAUDE.md +0 -1
- package/skills/autoconverge/CLAUDE.md +0 -1
- package/skills/autoconverge/reference/CLAUDE.md +0 -1
- package/skills/autoconverge/workflow/CLAUDE.md +0 -1
- package/skills/autoconverge/workflow/autoconverge_report_constants/CLAUDE.md +0 -1
- package/skills/bugteam/CLAUDE.md +0 -1
- package/skills/bugteam/reference/CLAUDE.md +0 -1
- package/skills/bugteam/reference/obstacles/CLAUDE.md +0 -1
- package/skills/bugteam/scripts/CLAUDE.md +0 -1
- package/skills/bugteam/scripts/bugteam_scripts_constants/CLAUDE.md +0 -1
- package/skills/codex-review/CLAUDE.md +0 -1
- package/skills/codex-review/reference/CLAUDE.md +0 -1
- package/skills/codex-review/scripts/codex_review_scripts_constants/CLAUDE.md +0 -1
- package/skills/copilot-review/CLAUDE.md +0 -1
- package/skills/everything-search/CLAUDE.md +0 -1
- package/skills/fresh-branch/CLAUDE.md +0 -1
- package/skills/grok-spawn/CLAUDE.md +0 -1
- package/skills/pr-converge/CLAUDE.md +0 -1
- package/skills/pr-converge/pr_converge_skill_constants/CLAUDE.md +0 -1
- package/skills/pr-converge/reference/CLAUDE.md +0 -1
- package/skills/pr-converge/reference/obstacles/CLAUDE.md +0 -1
- package/skills/pr-converge/scripts/CLAUDE.md +0 -1
- package/skills/pr-converge/scripts/pr_converge_scripts_constants/CLAUDE.md +0 -1
- package/skills/pr-converge/workflows/CLAUDE.md +0 -1
- package/skills/rebase/CLAUDE.md +0 -1
- package/skills/recall/CLAUDE.md +0 -1
- package/skills/remember/CLAUDE.md +0 -1
- package/skills/session-log/CLAUDE.md +0 -1
- package/skills/session-tidy/CLAUDE.md +0 -1
- package/skills/skill-builder/CLAUDE.md +0 -1
- package/skills/skill-builder/references/CLAUDE.md +0 -1
- package/skills/skill-builder/templates/CLAUDE.md +0 -1
- package/skills/skill-builder/workflows/CLAUDE.md +0 -1
- package/skills/task-build/CLAUDE.md +0 -1
- package/skills/update/CLAUDE.md +0 -1
- /package/{agents → .agents/agents}/clean-coder.md +0 -0
- /package/{agents → .agents/agents}/code-quality-agent.md +0 -0
- /package/{agents → .agents/agents}/git-commit-crafter.md +0 -0
- /package/{agents → .agents/agents}/issue-tracker.md +0 -0
- /package/{agents → .agents/agents}/plan-packet-validator.md +0 -0
- /package/{agents → .agents/agents}/pr-description-writer.md +0 -0
- /package/{agents → .agents/agents}/session-advisor.md +0 -0
- /package/{agents → .agents/agents}/skill-writer-agent.md +0 -0
- /package/{skills → .agents/skills}/_shared/advisor/AGENTS.md +0 -0
- /package/{skills → .agents/skills}/_shared/advisor/advisor-protocol.md +0 -0
- /package/{skills → .agents/skills}/_shared/advisor/scripts/README.md +0 -0
- /package/{skills → .agents/skills}/_shared/end-of-run-gotcha-recommendations.md +0 -0
- /package/{skills → .agents/skills}/_shared/pr-loop/AGENTS.md +0 -0
- /package/{skills → .agents/skills}/_shared/pr-loop/audit-contract.md +0 -0
- /package/{skills → .agents/skills}/_shared/pr-loop/audit-reply-template.md +0 -0
- /package/{skills → .agents/skills}/_shared/pr-loop/code-rules-gate.md +0 -0
- /package/{skills → .agents/skills}/_shared/pr-loop/fix-protocol.md +0 -0
- /package/{skills → .agents/skills}/_shared/pr-loop/gh-payloads.md +0 -0
- /package/{skills → .agents/skills}/_shared/pr-loop/portable-driver.md +0 -0
- /package/{skills → .agents/skills}/_shared/pr-loop/post-audit-thread-contract.md +0 -0
- /package/{skills → .agents/skills}/_shared/pr-loop/precatch-rubric.md +0 -0
- /package/{skills → .agents/skills}/_shared/pr-loop/prompts/AGENTS.md +0 -0
- /package/{skills → .agents/skills}/_shared/pr-loop/prompts/pr-consistency-audit.xml +0 -0
- /package/{skills → .agents/skills}/_shared/pr-loop/scripts/AGENTS.md +0 -0
- /package/{skills → .agents/skills}/_shared/pr-loop/scripts/RUNTIME_SCRIPTS.md +0 -0
- /package/{skills → .agents/skills}/_shared/pr-loop/scripts/_cli_utils.py +0 -0
- /package/{skills → .agents/skills}/_shared/pr-loop/scripts/_path_resolver.py +0 -0
- /package/{skills → .agents/skills}/_shared/pr-loop/scripts/_xml_utils.py +0 -0
- /package/{skills → .agents/skills}/_shared/pr-loop/scripts/audit_category_schema.py +0 -0
- /package/{skills → .agents/skills}/_shared/pr-loop/scripts/build_audit_prompt.py +0 -0
- /package/{skills → .agents/skills}/_shared/pr-loop/scripts/build_converge_task_list.py +0 -0
- /package/{skills → .agents/skills}/_shared/pr-loop/scripts/build_fix_prompt.py +0 -0
- /package/{skills → .agents/skills}/_shared/pr-loop/scripts/init_loop_state.py +0 -0
- /package/{skills → .agents/skills}/_shared/pr-loop/scripts/portable_converge_driver.py +0 -0
- /package/{skills → .agents/skills}/_shared/pr-loop/scripts/preflight_worktree.py +0 -0
- /package/{skills → .agents/skills}/_shared/pr-loop/scripts/select_converge_pacer.py +0 -0
- /package/{skills → .agents/skills}/_shared/pr-loop/scripts/skills_pr_loop_constants/AGENTS.md +0 -0
- /package/{skills → .agents/skills}/_shared/pr-loop/scripts/skills_pr_loop_constants/__init__.py +0 -0
- /package/{skills → .agents/skills}/_shared/pr-loop/scripts/skills_pr_loop_constants/converge_task_list_constants.py +0 -0
- /package/{skills → .agents/skills}/_shared/pr-loop/scripts/skills_pr_loop_constants/handoff_constants.py +0 -0
- /package/{skills → .agents/skills}/_shared/pr-loop/scripts/skills_pr_loop_constants/pacer_constants.py +0 -0
- /package/{skills → .agents/skills}/_shared/pr-loop/scripts/skills_pr_loop_constants/path_resolver_constants.py +0 -0
- /package/{skills → .agents/skills}/_shared/pr-loop/scripts/skills_pr_loop_constants/portable_driver_constants.py +0 -0
- /package/{skills → .agents/skills}/_shared/pr-loop/scripts/skills_pr_loop_constants/preflight_constants.py +0 -0
- /package/{skills → .agents/skills}/_shared/pr-loop/scripts/teardown_worktrees.py +0 -0
- /package/{skills → .agents/skills}/_shared/pr-loop/scripts/test__path_resolver.py +0 -0
- /package/{skills → .agents/skills}/_shared/pr-loop/scripts/test_audit_category_schema.py +0 -0
- /package/{skills → .agents/skills}/_shared/pr-loop/scripts/test_build_converge_task_list.py +0 -0
- /package/{skills → .agents/skills}/_shared/pr-loop/scripts/test_build_fix_prompt.py +0 -0
- /package/{skills → .agents/skills}/_shared/pr-loop/scripts/test_init_loop_state.py +0 -0
- /package/{skills → .agents/skills}/_shared/pr-loop/scripts/test_portable_converge_driver.py +0 -0
- /package/{skills → .agents/skills}/_shared/pr-loop/scripts/test_preflight_worktree.py +0 -0
- /package/{skills → .agents/skills}/_shared/pr-loop/scripts/test_select_converge_pacer.py +0 -0
- /package/{skills → .agents/skills}/_shared/pr-loop/scripts/test_teardown_worktrees.py +0 -0
- /package/{skills → .agents/skills}/_shared/pr-loop/scripts/test_write_handoff.py +0 -0
- /package/{skills → .agents/skills}/_shared/pr-loop/scripts/write_handoff.py +0 -0
- /package/{skills → .agents/skills}/_shared/pr-loop/state-schema.md +0 -0
- /package/{skills → .agents/skills}/_shared/pr-loop/worker-spawn.md +0 -0
- /package/{skills → .agents/skills}/anthropic-plan/SKILL.md +0 -0
- /package/{skills → .agents/skills}/anthropic-plan/scripts/AGENTS.md +0 -0
- /package/{skills → .agents/skills}/anthropic-plan/scripts/anthropic_plan_scripts_constants/AGENTS.md +0 -0
- /package/{skills → .agents/skills}/anthropic-plan/scripts/anthropic_plan_scripts_constants/__init__.py +0 -0
- /package/{skills → .agents/skills}/anthropic-plan/scripts/anthropic_plan_scripts_constants/validate_packet_constants.py +0 -0
- /package/{skills → .agents/skills}/anthropic-plan/scripts/test_validate_packet.py +0 -0
- /package/{skills → .agents/skills}/anthropic-plan/scripts/validate_packet.py +0 -0
- /package/{skills → .agents/skills}/anthropic-plan/templates/AGENTS.md +0 -0
- /package/{skills → .agents/skills}/anthropic-plan/templates/README.md +0 -0
- /package/{skills → .agents/skills}/anthropic-plan/templates/build-prompt.md +0 -0
- /package/{skills → .agents/skills}/anthropic-plan/templates/reuse-audit.md +0 -0
- /package/{skills → .agents/skills}/anthropic-plan/templates/source-map.md +0 -0
- /package/{skills → .agents/skills}/anthropic-plan/templates/visual-plan.template.html +0 -0
- /package/{skills → .agents/skills}/anthropic-plan/workflow/AGENTS.md +0 -0
- /package/{skills → .agents/skills}/anthropic-plan/workflow/plan-packet.contract.test.mjs +0 -0
- /package/{skills → .agents/skills}/anthropic-plan/workflow/plan-packet.mjs +0 -0
- /package/{skills → .agents/skills}/auditing-claude-config/AGENTS.md +0 -0
- /package/{skills → .agents/skills}/auditing-claude-config/SKILL.md +0 -0
- /package/{skills → .agents/skills}/auditing-claude-config/reference/probe-hook.md +0 -0
- /package/{skills → .agents/skills}/autoconverge/AGENTS.md +0 -0
- /package/{skills → .agents/skills}/autoconverge/SKILL.md +0 -0
- /package/{skills → .agents/skills}/autoconverge/reference/AGENTS.md +0 -0
- /package/{skills → .agents/skills}/autoconverge/reference/closing-report.md +0 -0
- /package/{skills → .agents/skills}/autoconverge/reference/convergence.md +0 -0
- /package/{skills → .agents/skills}/autoconverge/reference/copilot-findings.md +0 -0
- /package/{skills → .agents/skills}/autoconverge/reference/gotchas.md +0 -0
- /package/{skills → .agents/skills}/autoconverge/reference/headless-safety.md +0 -0
- /package/{skills → .agents/skills}/autoconverge/reference/multi-pr.md +0 -0
- /package/{skills → .agents/skills}/autoconverge/reference/self-closing-loop.md +0 -0
- /package/{skills → .agents/skills}/autoconverge/reference/stop-conditions.md +0 -0
- /package/{skills → .agents/skills}/autoconverge/test_portable_pacer_gate.py +0 -0
- /package/{skills → .agents/skills}/autoconverge/workflow/AGENTS.md +0 -0
- /package/{skills → .agents/skills}/autoconverge/workflow/aggregate_runs.py +0 -0
- /package/{skills → .agents/skills}/autoconverge/workflow/autoconverge_report_constants/AGENTS.md +0 -0
- /package/{skills → .agents/skills}/autoconverge/workflow/autoconverge_report_constants/__init__.py +0 -0
- /package/{skills → .agents/skills}/autoconverge/workflow/autoconverge_report_constants/render_report_constants.py +0 -0
- /package/{skills → .agents/skills}/autoconverge/workflow/converge.clean-audit.test.mjs +0 -0
- /package/{skills → .agents/skills}/autoconverge/workflow/converge.codex-gate.test.mjs +0 -0
- /package/{skills → .agents/skills}/autoconverge/workflow/converge.contract.test.mjs +0 -0
- /package/{skills → .agents/skills}/autoconverge/workflow/converge.copilot-gate.test.mjs +0 -0
- /package/{skills → .agents/skills}/autoconverge/workflow/converge.fix-progress.test.mjs +0 -0
- /package/{skills → .agents/skills}/autoconverge/workflow/converge.fix-recovery.test.mjs +0 -0
- /package/{skills → .agents/skills}/autoconverge/workflow/converge.merge-conflict.test.mjs +0 -0
- /package/{skills → .agents/skills}/autoconverge/workflow/converge.mjs +0 -0
- /package/{skills → .agents/skills}/autoconverge/workflow/converge.p2-advance.test.mjs +0 -0
- /package/{skills → .agents/skills}/autoconverge/workflow/converge.path-aware.test.mjs +0 -0
- /package/{skills → .agents/skills}/autoconverge/workflow/converge.precatch.test.mjs +0 -0
- /package/{skills → .agents/skills}/autoconverge/workflow/converge.run-input.test.mjs +0 -0
- /package/{skills → .agents/skills}/autoconverge/workflow/converge_multi.mjs +0 -0
- /package/{skills → .agents/skills}/autoconverge/workflow/converge_multi.run-input.test.mjs +0 -0
- /package/{skills → .agents/skills}/autoconverge/workflow/convergence_summary.py +0 -0
- /package/{skills → .agents/skills}/autoconverge/workflow/fixtures/wf_run/subagents/workflows/wf_881252e6-700/agent-a11d903476b803493.jsonl +0 -0
- /package/{skills → .agents/skills}/autoconverge/workflow/fixtures/wf_run/subagents/workflows/wf_881252e6-700/agent-a26213978adeef6fb.jsonl +0 -0
- /package/{skills → .agents/skills}/autoconverge/workflow/fixtures/wf_run/subagents/workflows/wf_881252e6-700/agent-a3def0d15ed9d9110.jsonl +0 -0
- /package/{skills → .agents/skills}/autoconverge/workflow/fixtures/wf_run/subagents/workflows/wf_881252e6-700/agent-a41f41b1b708ee3b7.jsonl +0 -0
- /package/{skills → .agents/skills}/autoconverge/workflow/fixtures/wf_run/subagents/workflows/wf_881252e6-700/agent-a758b880abecc3ff7.jsonl +0 -0
- /package/{skills → .agents/skills}/autoconverge/workflow/fixtures/wf_run/subagents/workflows/wf_881252e6-700/agent-a8897b89656b1bd16.jsonl +0 -0
- /package/{skills → .agents/skills}/autoconverge/workflow/fixtures/wf_run/subagents/workflows/wf_881252e6-700/agent-ab1c2d3e4f5a6b7c8.jsonl +0 -0
- /package/{skills → .agents/skills}/autoconverge/workflow/fixtures/wf_run/subagents/workflows/wf_881252e6-700/agent-abd463d744a1437bc.jsonl +0 -0
- /package/{skills → .agents/skills}/autoconverge/workflow/fixtures/wf_run/subagents/workflows/wf_881252e6-700/agent-ad19d027ae8ee1816.jsonl +0 -0
- /package/{skills → .agents/skills}/autoconverge/workflow/fixtures/wf_run/workflows/wf_881252e6-700.json +0 -0
- /package/{skills → .agents/skills}/autoconverge/workflow/render_report.py +0 -0
- /package/{skills → .agents/skills}/autoconverge/workflow/test_aggregate_runs.py +0 -0
- /package/{skills → .agents/skills}/autoconverge/workflow/test_convergence_summary.py +0 -0
- /package/{skills → .agents/skills}/autoconverge/workflow/test_render_report.py +0 -0
- /package/{skills → .agents/skills}/beat-sheet/SKILL.md +0 -0
- /package/{skills → .agents/skills}/beat-sheet/reference/visual-beats.md +0 -0
- /package/{skills → .agents/skills}/bugteam/AGENTS.md +0 -0
- /package/{skills → .agents/skills}/bugteam/CONSTRAINTS.md +0 -0
- /package/{skills → .agents/skills}/bugteam/EXAMPLES.md +0 -0
- /package/{skills → .agents/skills}/bugteam/PROMPTS.md +0 -0
- /package/{skills → .agents/skills}/bugteam/SKILL.md +0 -0
- /package/{skills → .agents/skills}/bugteam/reference/AGENTS.md +0 -0
- /package/{skills → .agents/skills}/bugteam/reference/README.md +0 -0
- /package/{skills → .agents/skills}/bugteam/reference/audit-and-teammates.md +0 -0
- /package/{skills → .agents/skills}/bugteam/reference/copilot-gap-analysis.md +0 -0
- /package/{skills → .agents/skills}/bugteam/reference/design-rationale.md +0 -0
- /package/{skills → .agents/skills}/bugteam/reference/github-pr-reviews.md +0 -0
- /package/{skills → .agents/skills}/bugteam/reference/obstacles/AGENTS.md +0 -0
- /package/{skills → .agents/skills}/bugteam/reference/obstacles/audit-assign-ids.md +0 -0
- /package/{skills → .agents/skills}/bugteam/reference/obstacles/audit-capture-excerpts.md +0 -0
- /package/{skills → .agents/skills}/bugteam/reference/obstacles/audit-walk-categories.md +0 -0
- /package/{skills → .agents/skills}/bugteam/reference/obstacles/audit-write-xml.md +0 -0
- /package/{skills → .agents/skills}/bugteam/reference/obstacles/fix-append-summary.md +0 -0
- /package/{skills → .agents/skills}/bugteam/reference/obstacles/fix-apply-fixes.md +0 -0
- /package/{skills → .agents/skills}/bugteam/reference/obstacles/fix-git-add-commit.md +0 -0
- /package/{skills → .agents/skills}/bugteam/reference/obstacles/fix-git-push.md +0 -0
- /package/{skills → .agents/skills}/bugteam/reference/obstacles/fix-post-reply.md +0 -0
- /package/{skills → .agents/skills}/bugteam/reference/obstacles/fix-publish-summary.md +0 -0
- /package/{skills → .agents/skills}/bugteam/reference/obstacles/fix-py-compile.md +0 -0
- /package/{skills → .agents/skills}/bugteam/reference/obstacles/fix-read-files.md +0 -0
- /package/{skills → .agents/skills}/bugteam/reference/obstacles/fix-resolve-thread.md +0 -0
- /package/{skills → .agents/skills}/bugteam/reference/obstacles/fix-test-suite.md +0 -0
- /package/{skills → .agents/skills}/bugteam/reference/obstacles/fix-violation-count.md +0 -0
- /package/{skills → .agents/skills}/bugteam/reference/obstacles/fix-write-xml.md +0 -0
- /package/{skills → .agents/skills}/bugteam/reference/team-setup.md +0 -0
- /package/{skills → .agents/skills}/bugteam/scripts/AGENTS.md +0 -0
- /package/{skills → .agents/skills}/bugteam/scripts/README.md +0 -0
- /package/{skills → .agents/skills}/bugteam/scripts/bugteam_scripts_constants/AGENTS.md +0 -0
- /package/{skills → .agents/skills}/bugteam/scripts/bugteam_scripts_constants/__init__.py +0 -0
- /package/{skills → .agents/skills}/bugteam/scripts/bugteam_scripts_constants/probe_code_rules_enforcer_check_constants.py +0 -0
- /package/{skills → .agents/skills}/bugteam/scripts/bugteam_scripts_constants/reflow_skill_md_constants.py +0 -0
- /package/{skills → .agents/skills}/bugteam/scripts/bugteam_scripts_constants/windows_safe_rmtree_constants.py +0 -0
- /package/{skills → .agents/skills}/bugteam/scripts/probe_code_rules_enforcer_check.py +0 -0
- /package/{skills → .agents/skills}/bugteam/scripts/test_bugteam_code_rules_gate.py +0 -0
- /package/{skills → .agents/skills}/bugteam/scripts/test_bugteam_fix_hookspath.py +0 -0
- /package/{skills → .agents/skills}/bugteam/scripts/test_bugteam_preflight.py +0 -0
- /package/{skills → .agents/skills}/bugteam/scripts/test_probe_code_rules_enforcer_check.py +0 -0
- /package/{skills → .agents/skills}/bugteam/scripts/test_windows_safe_rmtree.py +0 -0
- /package/{skills → .agents/skills}/bugteam/scripts/windows_safe_rmtree.py +0 -0
- /package/{skills → .agents/skills}/bugteam/sources.md +0 -0
- /package/{skills → .agents/skills}/bugteam/test_skill_additions.py +0 -0
- /package/{skills → .agents/skills}/closeout/SKILL.md +0 -0
- /package/{skills → .agents/skills}/closeout/reference/handoff-prompt-template.md +0 -0
- /package/{skills → .agents/skills}/closeout/reference/pii-redaction-checklist.md +0 -0
- /package/{skills → .agents/skills}/codex-review/AGENTS.md +0 -0
- /package/{skills → .agents/skills}/codex-review/SKILL.md +0 -0
- /package/{skills → .agents/skills}/codex-review/reference/AGENTS.md +0 -0
- /package/{skills → .agents/skills}/codex-review/reference/cli-contract.md +0 -0
- /package/{skills → .agents/skills}/codex-review/reference/loop-integration.md +0 -0
- /package/{skills → .agents/skills}/codex-review/scripts/codex_down_classifier.py +0 -0
- /package/{skills → .agents/skills}/codex-review/scripts/codex_review_scripts_constants/AGENTS.md +0 -0
- /package/{skills → .agents/skills}/codex-review/scripts/codex_review_scripts_constants/__init__.py +0 -0
- /package/{skills → .agents/skills}/codex-review/scripts/codex_review_scripts_constants/classifier_constants.py +0 -0
- /package/{skills → .agents/skills}/codex-review/scripts/codex_review_scripts_constants/codex_usage_probe_constants.py +0 -0
- /package/{skills → .agents/skills}/codex-review/scripts/codex_review_scripts_constants/findings_constants.py +0 -0
- /package/{skills → .agents/skills}/codex-review/scripts/codex_review_scripts_constants/run_constants.py +0 -0
- /package/{skills → .agents/skills}/codex-review/scripts/fixtures/auth_failure_synthetic.txt +0 -0
- /package/{skills → .agents/skills}/codex-review/scripts/fixtures/config_load_failure_v0.125.0.txt +0 -0
- /package/{skills → .agents/skills}/codex-review/scripts/fixtures/freeform_findings_v0.144.3.txt +0 -0
- /package/{skills → .agents/skills}/codex-review/scripts/fixtures/model_rejection_v0.125.0.jsonl +0 -0
- /package/{skills → .agents/skills}/codex-review/scripts/fixtures/structured_findings.txt +0 -0
- /package/{skills → .agents/skills}/codex-review/scripts/fixtures/success_stream_v0.144.3.jsonl +0 -0
- /package/{skills → .agents/skills}/codex-review/scripts/fixtures/unknown_failure_synthetic.txt +0 -0
- /package/{skills → .agents/skills}/codex-review/scripts/fixtures/usage_limit_synthetic.txt +0 -0
- /package/{skills → .agents/skills}/codex-review/scripts/parse_codex_findings.py +0 -0
- /package/{skills → .agents/skills}/codex-review/scripts/test_codex_down_classifier.py +0 -0
- /package/{skills → .agents/skills}/codex-review/scripts/test_codex_usage_probe.py +0 -0
- /package/{skills → .agents/skills}/codex-review/scripts/test_parse_codex_findings.py +0 -0
- /package/{skills → .agents/skills}/codex-review/scripts/test_run_codex_review.py +0 -0
- /package/{skills → .agents/skills}/comments/SKILL.md +0 -0
- /package/{skills → .agents/skills}/condensing-instructions/SKILL.md +0 -0
- /package/{skills → .agents/skills}/copilot-finding-triage/SKILL.md +0 -0
- /package/{skills → .agents/skills}/copilot-finding-triage/reference/tier-rubric.md +0 -0
- /package/{skills → .agents/skills}/copilot-finding-triage/scripts/conftest.py +0 -0
- /package/{skills → .agents/skills}/copilot-finding-triage/scripts/copilot_finding_triage_constants/__init__.py +0 -0
- /package/{skills → .agents/skills}/copilot-finding-triage/scripts/copilot_finding_triage_constants/config/__init__.py +0 -0
- /package/{skills → .agents/skills}/copilot-finding-triage/scripts/copilot_finding_triage_constants/config/notify_ntfy_constants.py +0 -0
- /package/{skills → .agents/skills}/copilot-finding-triage/scripts/notify_ntfy.py +0 -0
- /package/{skills → .agents/skills}/copilot-finding-triage/scripts/test_notify_ntfy.py +0 -0
- /package/{skills → .agents/skills}/copilot-finding-triage/templates/notification.md +0 -0
- /package/{skills → .agents/skills}/copilot-review/AGENTS.md +0 -0
- /package/{skills → .agents/skills}/copilot-review/SKILL.md +0 -0
- /package/{skills → .agents/skills}/copilot-review/templates/subagent-prompt.md +0 -0
- /package/{skills → .agents/skills}/descriptions/SKILL.md +0 -0
- /package/{skills → .agents/skills}/e-code-review/SKILL.md +0 -0
- /package/{skills → .agents/skills}/e-code-review/reference/fix.md +0 -0
- /package/{skills → .agents/skills}/e-code-review/reference/loop.md +0 -0
- /package/{skills → .agents/skills}/e-code-review/reference/low.md +0 -0
- /package/{skills → .agents/skills}/e-code-review/reference/medium.md +0 -0
- /package/{skills → .agents/skills}/e-code-review/reference/runner-selection.md +0 -0
- /package/{skills → .agents/skills}/e-code-review/reference/xhigh.md +0 -0
- /package/{skills → .agents/skills}/e-code-review/scripts/config/e_code_review_effort_constants/__init__.py +0 -0
- /package/{skills → .agents/skills}/e-code-review/scripts/config/e_code_review_effort_constants/effort_constants.py +0 -0
- /package/{skills → .agents/skills}/e-code-review/scripts/e_code_review_scripts_constants/__init__.py +0 -0
- /package/{skills → .agents/skills}/e-code-review/scripts/e_code_review_scripts_constants/finding_pipeline_constants.py +0 -0
- /package/{skills → .agents/skills}/e-code-review/scripts/e_code_review_scripts_constants/grok_code_review_constants.py +0 -0
- /package/{skills → .agents/skills}/e-code-review/scripts/effort_defaults_evidence.json +0 -0
- /package/{skills → .agents/skills}/e-code-review/scripts/effort_evaluation.py +0 -0
- /package/{skills → .agents/skills}/e-code-review/scripts/finding_pipeline.py +0 -0
- /package/{skills → .agents/skills}/e-code-review/scripts/fixtures/demanding.json +0 -0
- /package/{skills → .agents/skills}/e-code-review/scripts/fixtures/easy.json +0 -0
- /package/{skills → .agents/skills}/e-code-review/scripts/fixtures/medium.json +0 -0
- /package/{skills → .agents/skills}/e-code-review/scripts/grok_code_review.py +0 -0
- /package/{skills → .agents/skills}/e-code-review/scripts/test_effort_evaluation.py +0 -0
- /package/{skills → .agents/skills}/e-code-review/scripts/test_finding_pipeline.py +0 -0
- /package/{skills → .agents/skills}/e-code-review/scripts/test_grok_code_review.py +0 -0
- /package/{skills → .agents/skills}/e-simplify/SKILL.md +0 -0
- /package/{skills → .agents/skills}/emergencies/SKILL.md +0 -0
- /package/{skills → .agents/skills}/everything-search/AGENTS.md +0 -0
- /package/{skills → .agents/skills}/everything-search/SKILL.md +0 -0
- /package/{skills → .agents/skills}/fresh-branch/AGENTS.md +0 -0
- /package/{skills → .agents/skills}/fresh-branch/SKILL.md +0 -0
- /package/{skills → .agents/skills}/fresh-branch/scripts/create_fresh_branch.py +0 -0
- /package/{skills → .agents/skills}/fresh-branch/scripts/fresh_branch_git_commands.py +0 -0
- /package/{skills → .agents/skills}/fresh-branch/scripts/fresh_branch_scripts_constants/__init__.py +0 -0
- /package/{skills → .agents/skills}/fresh-branch/scripts/fresh_branch_scripts_constants/fresh_branch_cli_constants.py +0 -0
- /package/{skills → .agents/skills}/fresh-branch/scripts/pytest.ini +0 -0
- /package/{skills → .agents/skills}/fresh-branch/scripts/test_create_fresh_branch.py +0 -0
- /package/{skills → .agents/skills}/fresh-branch/scripts/test_fresh_branch_git_commands.py +0 -0
- /package/{skills → .agents/skills}/grok-spawn/AGENTS.md +0 -0
- /package/{skills → .agents/skills}/grok-spawn/SKILL.md +0 -0
- /package/{skills → .agents/skills}/grok-spawn/reference/flag-profiles.md +0 -0
- /package/{skills → .agents/skills}/grok-spawn/reference/worker-briefs.md +0 -0
- /package/{skills → .agents/skills}/grokify/SKILL.md +0 -0
- /package/{skills → .agents/skills}/grokify/capability-claims.test.mjs +0 -0
- /package/{skills → .agents/skills}/grokify/evals/parse-payload.test.mjs +0 -0
- /package/{skills → .agents/skills}/grokify/evals/run-capability-evals.mjs +0 -0
- /package/{skills → .agents/skills}/grokify/templates/handoff-template.md +0 -0
- /package/{skills → .agents/skills}/issue-tracker/SKILL.md +0 -0
- /package/{skills → .agents/skills}/issue-tracker/reference/epic-and-sub-issue-model.md +0 -0
- /package/{skills → .agents/skills}/issue-tracker/reference/handoff-schema.md +0 -0
- /package/{skills → .agents/skills}/issue-tracker/reference/operation-matrix.md +0 -0
- /package/{skills → .agents/skills}/orchestrator/SKILL.md +0 -0
- /package/{skills → .agents/skills}/orchestrator/scripts/status_gate.py +0 -0
- /package/{skills → .agents/skills}/orchestrator/scripts/status_gate_constants/__init__.py +0 -0
- /package/{skills → .agents/skills}/orchestrator/scripts/status_gate_constants/config/__init__.py +0 -0
- /package/{skills → .agents/skills}/orchestrator/scripts/status_gate_constants/config/constants.py +0 -0
- /package/{skills → .agents/skills}/orchestrator/scripts/test_status_gate.py +0 -0
- /package/{skills → .agents/skills}/orchestrator-refresh/SKILL.md +0 -0
- /package/{skills → .agents/skills}/plan-to-pr/SKILL.md +0 -0
- /package/{skills → .agents/skills}/plan-to-pr/reference/final-validation-tasks.md +0 -0
- /package/{skills → .agents/skills}/plan-to-pr/reference/model-routing.md +0 -0
- /package/{skills → .agents/skills}/plan-to-pr/reference/packet-contract.md +0 -0
- /package/{skills → .agents/skills}/plan-to-pr/reference/packet-schema.json +0 -0
- /package/{skills → .agents/skills}/plan-to-pr/reference/process-inventory.md +0 -0
- /package/{skills → .agents/skills}/plan-to-pr/reference/review-loop.md +0 -0
- /package/{skills → .agents/skills}/plan-to-pr/reference/run-record.schema.json +0 -0
- /package/{skills → .agents/skills}/plan-to-pr/reference/self-audit-tasks.md +0 -0
- /package/{skills → .agents/skills}/plan-to-pr/reference/task-seeds.md +0 -0
- /package/{skills → .agents/skills}/plan-to-pr/reference/task-ticket.md +0 -0
- /package/{skills → .agents/skills}/plan-to-pr/scripts/config/__init__.py +0 -0
- /package/{skills → .agents/skills}/plan-to-pr/scripts/config/constants.py +0 -0
- /package/{skills → .agents/skills}/plan-to-pr/scripts/create_packet.py +0 -0
- /package/{skills → .agents/skills}/plan-to-pr/scripts/load_skill_constants.py +0 -0
- /package/{skills → .agents/skills}/plan-to-pr/scripts/test_create_packet.py +0 -0
- /package/{skills → .agents/skills}/plan-to-pr/scripts/test_validate_packet.py +0 -0
- /package/{skills → .agents/skills}/plan-to-pr/scripts/test_validate_protocol.py +0 -0
- /package/{skills → .agents/skills}/plan-to-pr/scripts/test_validate_run.py +0 -0
- /package/{skills → .agents/skills}/plan-to-pr/scripts/validate_packet.py +0 -0
- /package/{skills → .agents/skills}/plan-to-pr/scripts/validate_protocol.py +0 -0
- /package/{skills → .agents/skills}/plan-to-pr/scripts/validate_run.py +0 -0
- /package/{skills → .agents/skills}/plan-to-pr/test_skill_contract.py +0 -0
- /package/{skills → .agents/skills}/plan-to-pr/test_task_ticket_contract.py +0 -0
- /package/{skills → .agents/skills}/pr-converge/AGENTS.md +0 -0
- /package/{skills → .agents/skills}/pr-converge/SKILL.md +0 -0
- /package/{skills → .agents/skills}/pr-converge/pr_converge_skill_constants/__init__.py +0 -0
- /package/{skills → .agents/skills}/pr-converge/reference/AGENTS.md +0 -0
- /package/{skills → .agents/skills}/pr-converge/reference/convergence-gates.md +0 -0
- /package/{skills → .agents/skills}/pr-converge/reference/examples.md +0 -0
- /package/{skills → .agents/skills}/pr-converge/reference/fix-protocol.md +0 -0
- /package/{skills → .agents/skills}/pr-converge/reference/ground-rules.md +0 -0
- /package/{skills → .agents/skills}/pr-converge/reference/multi-pr-orchestration.md +0 -0
- /package/{skills → .agents/skills}/pr-converge/reference/obstacles/AGENTS.md +0 -0
- /package/{skills → .agents/skills}/pr-converge/reference/obstacles/fix-post-replies.md +0 -0
- /package/{skills → .agents/skills}/pr-converge/reference/obstacles/fix-publish-summary.md +0 -0
- /package/{skills → .agents/skills}/pr-converge/reference/obstacles/fix-push.md +0 -0
- /package/{skills → .agents/skills}/pr-converge/reference/obstacles/fix-read-filelines.md +0 -0
- /package/{skills → .agents/skills}/pr-converge/reference/obstacles/fix-reset-state.md +0 -0
- /package/{skills → .agents/skills}/pr-converge/reference/obstacles/fix-resolve-threads.md +0 -0
- /package/{skills → .agents/skills}/pr-converge/reference/obstacles/fix-spawn-clean-coder.md +0 -0
- /package/{skills → .agents/skills}/pr-converge/reference/obstacles/fix-stage-commit.md +0 -0
- /package/{skills → .agents/skills}/pr-converge/reference/obstacles/fix-trigger-bugbot.md +0 -0
- /package/{skills → .agents/skills}/pr-converge/reference/obstacles/fix-write-test.md +0 -0
- /package/{skills → .agents/skills}/pr-converge/reference/per-tick.md +0 -0
- /package/{skills → .agents/skills}/pr-converge/reference/progress-checklist.md +0 -0
- /package/{skills → .agents/skills}/pr-converge/reference/state-schema.md +0 -0
- /package/{skills → .agents/skills}/pr-converge/reference/stop-conditions.md +0 -0
- /package/{skills → .agents/skills}/pr-converge/scripts/AGENTS.md +0 -0
- /package/{skills → .agents/skills}/pr-converge/scripts/README.md +0 -0
- /package/{skills → .agents/skills}/pr-converge/scripts/caller-window-pid.ps1 +0 -0
- /package/{skills → .agents/skills}/pr-converge/scripts/check_bugbot_ci.py +0 -0
- /package/{skills → .agents/skills}/pr-converge/scripts/check_convergence.py +0 -0
- /package/{skills → .agents/skills}/pr-converge/scripts/check_convergence_availability.py +0 -0
- /package/{skills → .agents/skills}/pr-converge/scripts/check_convergence_gates.py +0 -0
- /package/{skills → .agents/skills}/pr-converge/scripts/check_convergence_thread_gates.py +0 -0
- /package/{skills → .agents/skills}/pr-converge/scripts/check_pending_reviews.py +0 -0
- /package/{skills → .agents/skills}/pr-converge/scripts/conftest.py +0 -0
- /package/{skills → .agents/skills}/pr-converge/scripts/cursor-agents-continue-caller.cmd +0 -0
- /package/{skills → .agents/skills}/pr-converge/scripts/cursor-agents-continue-stop-others.ps1 +0 -0
- /package/{skills → .agents/skills}/pr-converge/scripts/cursor-agents-continue.ahk +0 -0
- /package/{skills → .agents/skills}/pr-converge/scripts/cursor-agents-continue.cmd +0 -0
- /package/{skills → .agents/skills}/pr-converge/scripts/fetch_copilot_reviews.py +0 -0
- /package/{skills → .agents/skills}/pr-converge/scripts/post_fix_reply.py +0 -0
- /package/{skills → .agents/skills}/pr-converge/scripts/pr_converge_scripts_constants/AGENTS.md +0 -0
- /package/{skills → .agents/skills}/pr-converge/scripts/pr_converge_scripts_constants/__init__.py +0 -0
- /package/{skills → .agents/skills}/pr-converge/scripts/pr_converge_scripts_constants/convergence_gate_constants.py +0 -0
- /package/{skills → .agents/skills}/pr-converge/scripts/pr_converge_scripts_constants/pr_converge_constants.py +0 -0
- /package/{skills → .agents/skills}/pr-converge/scripts/pr_converge_scripts_constants/reflow_skill_md_constants.py +0 -0
- /package/{skills → .agents/skills}/pr-converge/scripts/test_check_bugbot_ci.py +0 -0
- /package/{skills → .agents/skills}/pr-converge/scripts/test_check_convergence.py +0 -0
- /package/{skills → .agents/skills}/pr-converge/scripts/test_check_convergence_availability.py +0 -0
- /package/{skills → .agents/skills}/pr-converge/scripts/test_check_convergence_codex.py +0 -0
- /package/{skills → .agents/skills}/pr-converge/scripts/test_check_convergence_contract.py +0 -0
- /package/{skills → .agents/skills}/pr-converge/scripts/test_check_convergence_fixture.py +0 -0
- /package/{skills → .agents/skills}/pr-converge/scripts/test_check_convergence_gates.py +0 -0
- /package/{skills → .agents/skills}/pr-converge/scripts/test_check_convergence_thread_gates.py +0 -0
- /package/{skills → .agents/skills}/pr-converge/scripts/test_cursor_agents_continue.py +0 -0
- /package/{skills → .agents/skills}/pr-converge/scripts/test_reflow_skill_md.py +0 -0
- /package/{skills → .agents/skills}/pr-converge/test_portable_pacer_gate.py +0 -0
- /package/{skills → .agents/skills}/pr-converge/test_step5_host_branch.py +0 -0
- /package/{skills → .agents/skills}/pr-converge/workflows/AGENTS.md +0 -0
- /package/{skills → .agents/skills}/pr-converge/workflows/schedule-wakeup-loop.md +0 -0
- /package/{skills → .agents/skills}/pr-fix-protocol/SKILL.md +0 -0
- /package/{skills → .agents/skills}/pr-loop-cloud-transport/SKILL.md +0 -0
- /package/{skills → .agents/skills}/pr-loop-cloud-transport/reference/identity-and-hooks.md +0 -0
- /package/{skills → .agents/skills}/pr-loop-cloud-transport/reference/substitution-matrix.md +0 -0
- /package/{skills → .agents/skills}/pr-loop-lifecycle/SKILL.md +0 -0
- /package/{skills → .agents/skills}/pr-loop-lifecycle/reference/teardown-publish-permissions.md +0 -0
- /package/{skills → .agents/skills}/privacy-hygiene/SKILL.md +0 -0
- /package/{skills → .agents/skills}/privacy-hygiene/reference/sweep-procedure.md +0 -0
- /package/{skills → .agents/skills}/prototype/SKILL.md +0 -0
- /package/{skills → .agents/skills}/prototype/reference/honest-limitations.md +0 -0
- /package/{skills → .agents/skills}/prototype/reference/promotion-tasks.md +0 -0
- /package/{skills → .agents/skills}/prototype/scripts/build_sandbox_settings.py +0 -0
- /package/{skills → .agents/skills}/prototype/scripts/conftest.py +0 -0
- /package/{skills → .agents/skills}/prototype/scripts/launch_sandbox.py +0 -0
- /package/{skills → .agents/skills}/prototype/scripts/probe_sandbox_safety.py +0 -0
- /package/{skills → .agents/skills}/prototype/scripts/prototype_scripts_constants/__init__.py +0 -0
- /package/{skills → .agents/skills}/prototype/scripts/prototype_scripts_constants/config/__init__.py +0 -0
- /package/{skills → .agents/skills}/prototype/scripts/prototype_scripts_constants/config/build_sandbox_settings_constants.py +0 -0
- /package/{skills → .agents/skills}/prototype/scripts/prototype_scripts_constants/config/launch_sandbox_constants.py +0 -0
- /package/{skills → .agents/skills}/prototype/scripts/prototype_scripts_constants/config/probe_sandbox_safety_constants.py +0 -0
- /package/{skills → .agents/skills}/prototype/scripts/prototype_scripts_constants/config/prototype_common_constants.py +0 -0
- /package/{skills → .agents/skills}/prototype/scripts/test_build_sandbox_settings.py +0 -0
- /package/{skills → .agents/skills}/prototype/scripts/test_launch_sandbox.py +0 -0
- /package/{skills → .agents/skills}/prototype/workflows/promotion.md +0 -0
- /package/{skills → .agents/skills}/prototype/workflows/sandbox.md +0 -0
- /package/{skills → .agents/skills}/rebase/AGENTS.md +0 -0
- /package/{skills → .agents/skills}/rebase/SKILL.md +0 -0
- /package/{skills → .agents/skills}/recall/AGENTS.md +0 -0
- /package/{skills → .agents/skills}/recall/SKILL.md +0 -0
- /package/{skills → .agents/skills}/release-notes-html/SKILL.md +0 -0
- /package/{skills → .agents/skills}/remember/AGENTS.md +0 -0
- /package/{skills → .agents/skills}/remember/SKILL.md +0 -0
- /package/{skills → .agents/skills}/reviewer-gates/SKILL.md +0 -0
- /package/{skills → .agents/skills}/reviews/SKILL.md +0 -0
- /package/{skills → .agents/skills}/session-log/AGENTS.md +0 -0
- /package/{skills → .agents/skills}/session-log/SKILL.md +0 -0
- /package/{skills → .agents/skills}/session-log/templates/frontmatter.md +0 -0
- /package/{skills → .agents/skills}/session-tidy/AGENTS.md +0 -0
- /package/{skills → .agents/skills}/session-tidy/SKILL.md +0 -0
- /package/{skills → .agents/skills}/show/SKILL.md +0 -0
- /package/{skills → .agents/skills}/show/references/accessibility.md +0 -0
- /package/{skills → .agents/skills}/show/references/art.md +0 -0
- /package/{skills → .agents/skills}/show/references/charts.md +0 -0
- /package/{skills → .agents/skills}/show/references/core-design.md +0 -0
- /package/{skills → .agents/skills}/show/references/erds.md +0 -0
- /package/{skills → .agents/skills}/show/references/flowcharts.md +0 -0
- /package/{skills → .agents/skills}/show/references/host-and-html.md +0 -0
- /package/{skills → .agents/skills}/show/references/illustrative-diagrams.md +0 -0
- /package/{skills → .agents/skills}/show/references/interaction.md +0 -0
- /package/{skills → .agents/skills}/show/references/mockups.md +0 -0
- /package/{skills → .agents/skills}/show/references/quality-gates.md +0 -0
- /package/{skills → .agents/skills}/show/references/structural-diagrams.md +0 -0
- /package/{skills → .agents/skills}/show/references/subject-inventory.md +0 -0
- /package/{skills → .agents/skills}/show/references/svg-contract.md +0 -0
- /package/{skills → .agents/skills}/show/routing.yaml +0 -0
- /package/{skills → .agents/skills}/show/samples/pr1262-v2.svg +0 -0
- /package/{skills → .agents/skills}/show/scripts/README.md +0 -0
- /package/{skills → .agents/skills}/show/scripts/validate-artifact.py +0 -0
- /package/{skills → .agents/skills}/show/scripts/validate-package.py +0 -0
- /package/{skills → .agents/skills}/show/templates/html-widget.html +0 -0
- /package/{skills → .agents/skills}/show/templates/svg-base.svg +0 -0
- /package/{skills → .agents/skills}/show/tests/fixtures/css-var.svg +0 -0
- /package/{skills → .agents/skills}/show/tests/fixtures/dead-ref.svg +0 -0
- /package/{skills → .agents/skills}/show/tests/fixtures/filled-glyph.svg +0 -0
- /package/{skills → .agents/skills}/show/tests/fixtures/inherited-fill.svg +0 -0
- /package/{skills → .agents/skills}/show/tests/fixtures/invalid.svg +0 -0
- /package/{skills → .agents/skills}/show/tests/fixtures/large-canvas.svg +0 -0
- /package/{skills → .agents/skills}/show/tests/fixtures/unfilled-connector.svg +0 -0
- /package/{skills → .agents/skills}/show/tests/fixtures/valid.html +0 -0
- /package/{skills → .agents/skills}/show/tests/test_validate-artifact.py +0 -0
- /package/{skills → .agents/skills}/show/tests/test_validators.py +0 -0
- /package/{skills → .agents/skills}/show/workflows/create-visual.md +0 -0
- /package/{skills → .agents/skills}/show/workflows/review-visual.md +0 -0
- /package/{skills → .agents/skills}/skill-builder/AGENTS.md +0 -0
- /package/{skills → .agents/skills}/skill-builder/SKILL.md +0 -0
- /package/{skills → .agents/skills}/skill-builder/references/AGENTS.md +0 -0
- /package/{skills → .agents/skills}/skill-builder/references/delegation-map.md +0 -0
- /package/{skills → .agents/skills}/skill-builder/references/description-field.md +0 -0
- /package/{skills → .agents/skills}/skill-builder/references/progressive-disclosure.md +0 -0
- /package/{skills → .agents/skills}/skill-builder/references/self-audit-checklist.md +0 -0
- /package/{skills → .agents/skills}/skill-builder/references/skill-modularity.md +0 -0
- /package/{skills → .agents/skills}/skill-builder/references/skill-types.md +0 -0
- /package/{skills → .agents/skills}/skill-builder/references/thariq-x-post-skills.json +0 -0
- /package/{skills → .agents/skills}/skill-builder/templates/AGENTS.md +0 -0
- /package/{skills → .agents/skills}/skill-builder/templates/gap-analysis.md +0 -0
- /package/{skills → .agents/skills}/skill-builder/workflows/AGENTS.md +0 -0
- /package/{skills → .agents/skills}/skill-builder/workflows/improve-skill.md +0 -0
- /package/{skills → .agents/skills}/skill-builder/workflows/new-skill.md +0 -0
- /package/{skills → .agents/skills}/skill-builder/workflows/polish-skill.md +0 -0
- /package/{skills → .agents/skills}/small-cl/SKILL.md +0 -0
- /package/{skills → .agents/skills}/split-pr/SKILL.md +0 -0
- /package/{skills → .agents/skills}/split-pr/reference/path-layers.md +0 -0
- /package/{skills → .agents/skills}/split-pr/reference/split-further-loop.md +0 -0
- /package/{skills → .agents/skills}/split-pr/reference/splitting-principles.md +0 -0
- /package/{skills → .agents/skills}/split-pr/scripts/analyze_pr.py +0 -0
- /package/{skills → .agents/skills}/split-pr/scripts/categorize_files.py +0 -0
- /package/{skills → .agents/skills}/split-pr/scripts/config/__init__.py +0 -0
- /package/{skills → .agents/skills}/split-pr/scripts/config/dependency_constants.py +0 -0
- /package/{skills → .agents/skills}/split-pr/scripts/config/git_operations_constants.py +0 -0
- /package/{skills → .agents/skills}/split-pr/scripts/config/packing_constants.py +0 -0
- /package/{skills → .agents/skills}/split-pr/scripts/config/plan_constants.py +0 -0
- /package/{skills → .agents/skills}/split-pr/scripts/config/split_pr_constants.py +0 -0
- /package/{skills → .agents/skills}/split-pr/scripts/execute_split_slices.py +0 -0
- /package/{skills → .agents/skills}/split-pr/scripts/pack_files_into_slices.py +0 -0
- /package/{skills → .agents/skills}/split-pr/scripts/split_pr_dependency_graph.py +0 -0
- /package/{skills → .agents/skills}/split-pr/scripts/split_pr_git_operations.py +0 -0
- /package/{skills → .agents/skills}/split-pr/scripts/split_pr_layer_order.py +0 -0
- /package/{skills → .agents/skills}/split-pr/scripts/split_pr_paginate.py +0 -0
- /package/{skills → .agents/skills}/split-pr/scripts/split_pr_process_runner.py +0 -0
- /package/{skills → .agents/skills}/split-pr/scripts/split_pr_script_types.py +0 -0
- /package/{skills → .agents/skills}/split-pr/scripts/split_pr_title.py +0 -0
- /package/{skills → .agents/skills}/split-pr/scripts/test_analyze_pr.py +0 -0
- /package/{skills → .agents/skills}/split-pr/scripts/test_categorize_files.py +0 -0
- /package/{skills → .agents/skills}/split-pr/scripts/test_categorize_files_packing.py +0 -0
- /package/{skills → .agents/skills}/split-pr/scripts/test_execute_split_slices.py +0 -0
- /package/{skills → .agents/skills}/split-pr/scripts/test_split_pr_dependency_graph.py +0 -0
- /package/{skills → .agents/skills}/split-pr/scripts/test_split_pr_git_operations.py +0 -0
- /package/{skills → .agents/skills}/split-pr/scripts/test_split_pr_layer_order.py +0 -0
- /package/{skills → .agents/skills}/split-pr/scripts/test_split_pr_paginate.py +0 -0
- /package/{skills → .agents/skills}/split-pr/scripts/test_split_pr_script_types.py +0 -0
- /package/{skills → .agents/skills}/split-pr/scripts/test_split_pr_title.py +0 -0
- /package/{skills → .agents/skills}/split-pr/scripts/test_verify_dependency_graph.py +0 -0
- /package/{skills → .agents/skills}/split-pr/scripts/test_verify_plan.py +0 -0
- /package/{skills → .agents/skills}/split-pr/scripts/test_verify_plan_contract.py +0 -0
- /package/{skills → .agents/skills}/split-pr/scripts/test_verify_plan_path_normalization.py +0 -0
- /package/{skills → .agents/skills}/split-pr/scripts/verify_dependency_graph.py +0 -0
- /package/{skills → .agents/skills}/split-pr/scripts/verify_plan.py +0 -0
- /package/{skills → .agents/skills}/task-build/AGENTS.md +0 -0
- /package/{skills → .agents/skills}/task-build/SKILL.md +0 -0
- /package/{skills → .agents/skills}/task-build/reference/tool-routing.md +0 -0
- /package/{skills → .agents/skills}/team-advisor/SKILL.md +0 -0
- /package/{skills → .agents/skills}/team-advisor/reference/advisor-docs-review.md +0 -0
- /package/{skills → .agents/skills}/update/AGENTS.md +0 -0
- /package/{skills → .agents/skills}/update/SKILL.md +0 -0
- /package/{skills → .agents/skills}/usage-pause/SKILL.md +0 -0
- /package/{skills → .agents/skills}/usage-pause/scripts/resolve_usage_window.py +0 -0
- /package/{skills → .agents/skills}/usage-pause/scripts/test_resolve_usage_window.py +0 -0
- /package/{skills → .agents/skills}/usage-pause/scripts/usage_pause_constants/__init__.py +0 -0
- /package/{skills → .agents/skills}/usage-pause/scripts/usage_pause_constants/resolve_usage_window_constants.py +0 -0
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: run-claude-dev-env
|
|
3
|
+
description: Build, install, run, and test the claude-dev-env installer. Use when asked to run claude-dev-env, install the Claude Code config into ~/.claude, drive the installer, smoke-test it against a sandbox, or run its test suite.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
`claude-dev-env` is the npm-distributed installer that copies this repo's rules, hooks, commands, and docs into `~/.claude/`, copies skills and agents into `~/.agents/`, publishes directory pointers at `~/.claude/skills` and `~/.claude/agents`, and merges its hook entries into `~/.claude/settings.json`. Its entry point is `bin/install.mjs`. Drive it with the smoke driver at `.claude/skills/run-claude-dev-env/driver.mjs`, which runs the installer against a throwaway sandbox home directory so a run never touches the real `~/.claude/` or `~/.agents/`.
|
|
7
|
+
|
|
8
|
+
All paths below are written from the `packages/claude-dev-env/` directory.
|
|
9
|
+
|
|
10
|
+
## Prerequisites
|
|
11
|
+
|
|
12
|
+
The installer needs three tools on `PATH`:
|
|
13
|
+
|
|
14
|
+
- **Node.js 18+** — the installer is an ES module (verified on Node 22.17).
|
|
15
|
+
- **Python 3.8+** — the installer bakes a Python interpreter into every hook command and aborts if it finds none. On Windows it skips the Microsoft Store stub (verified `py -3` → Python 3.13.5).
|
|
16
|
+
- **git** — the installer reads `git status` to guard against installing from a conflicted source, and sets a global git hooks path.
|
|
17
|
+
|
|
18
|
+
```bash
|
|
19
|
+
node --version
|
|
20
|
+
git --version
|
|
21
|
+
py -3 --version # POSIX: python3 --version
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
On a fresh Ubuntu container the three come from `sudo apt-get install -y nodejs python3 git`.
|
|
25
|
+
|
|
26
|
+
## Run (agent path) — the smoke driver
|
|
27
|
+
|
|
28
|
+
The driver is the handle to reach for first. It spawns the installer against a fresh temp home directory with `HOME`, `USERPROFILE`, and `GIT_CONFIG_GLOBAL` all redirected, runs the `--help` → install → `--uninstall` lifecycle, asserts the result of each step against the sandbox tree, then deletes the sandbox. It works the same on Windows and POSIX.
|
|
29
|
+
|
|
30
|
+
```bash
|
|
31
|
+
node .claude/skills/run-claude-dev-env/driver.mjs
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
Expected tail:
|
|
35
|
+
|
|
36
|
+
```
|
|
37
|
+
21/21 checks passed.
|
|
38
|
+
ALL CHECKS PASSED
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
The driver proves a full install lands skills under `<sandbox>/.agents/skills` with a directory pointer at `<sandbox>/.claude/skills`, lands agents the same way, lands hook scripts, rules, the `CLAUDE.md` hub, a populated `settings.json`, and a tracking manifest, and that `--uninstall` removes every manifest-tracked file. The real `~/.claude/`, `~/.agents/`, and the real global git config stay untouched. Exit code is 0 only when all checks hold.
|
|
42
|
+
|
|
43
|
+
## Run (human path) — install for real
|
|
44
|
+
|
|
45
|
+
These write into your real `~/.claude/` and set a global git hooks path. Run them only when you mean to install on this machine.
|
|
46
|
+
|
|
47
|
+
```bash
|
|
48
|
+
node bin/install.mjs --help # usage only, no side effects
|
|
49
|
+
node bin/install.mjs # install every group
|
|
50
|
+
node bin/install.mjs --only core # install one or more named groups
|
|
51
|
+
node bin/install.mjs --update # remove manifest-tracked files, then reinstall
|
|
52
|
+
node bin/install.mjs --uninstall # remove every installed file
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
Groups: `core`, `journal`, and the discovered `prompt-generator` dependency group. Run `node bin/install.mjs --help` for the live list. The published package runs the same entry point as `npx claude-dev-env`.
|
|
56
|
+
|
|
57
|
+
## Test
|
|
58
|
+
|
|
59
|
+
```bash
|
|
60
|
+
npm test
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
Runs `node --test` over `bin/*.test.mjs` and `.agents/skills/**/*.test.mjs` with Node's built-in test runner — no extra dependency, no network. Expected: `# fail 0`, with the pass count growing as tests are added.
|
|
64
|
+
|
|
65
|
+
## Gotchas
|
|
66
|
+
|
|
67
|
+
- **The install target is `os.homedir()/.claude` with no override flag** (the `CLAUDE_HOME` constant in `bin/install.mjs`). To drive the installer without overwriting your real config, redirect the home directory: set `USERPROFILE` (Windows) and `HOME` (POSIX) to a temp dir. The driver does this for you.
|
|
68
|
+
- **The installer reaches outside `~/.claude/`.** It writes skills and agents under `~/.agents/`, runs `git config --global core.hooksPath ...`, which applies to every git repo on the machine, and it writes `~/.mypy.ini`. The driver isolates those writes by pointing `GIT_CONFIG_GLOBAL` at a sandbox file and redirecting the home directory.
|
|
69
|
+
- **git "dubious ownership" aborts the install.** The source-conflict guard runs `git status`; when the checkout sits on a path git distrusts (a UNC network share owned by another account), git exits 128 with a dubious-ownership message that the installer rethrows. The driver seeds its sandbox git config with `safe.directory = *` so the guard runs. For a real install on such a checkout, add the exception: `git config --global --add safe.directory '<repo-path>'`.
|
|
70
|
+
- **`npm install` at the repo root fails on a Windows network-share checkout.** npm symlinks the workspace package into root `node_modules` and the share rejects the symlink (`UNKNOWN ... symlink`, errno -4094). The package's own `node_modules` already carries its single dependency, so the driver and tests run without it. The installer also keeps working when `@jl-cmd/prompt-generator` cannot resolve — it skips that group with a warning (`discoverDependencyGroups` in `bin/install.mjs`).
|
|
71
|
+
- **Microsoft Store Python is rejected on Windows.** The installer skips any interpreter under a `WindowsApps` directory because that stub cannot run as a hook subprocess (`isWindowsStorePythonStub` in `bin/install.mjs`). Install Python from python.org if detection fails.
|
|
72
|
+
|
|
73
|
+
## Troubleshooting
|
|
74
|
+
|
|
75
|
+
- **`ERROR: No usable Python 3 found`**: no `py -3` / `python3` / `python` resolves to a non-Store Python 3. Install Python 3.8+ from python.org and reopen the shell.
|
|
76
|
+
- **`fatal: detected dubious ownership in repository`**: add the `safe.directory` exception shown above, then rerun.
|
|
77
|
+
- **`ERROR: settings.json is malformed JSON`**: `~/.claude/settings.json` has a syntax error; fix the JSON and rerun.
|
|
78
|
+
|
|
79
|
+
## Files
|
|
80
|
+
|
|
81
|
+
- `SKILL.md` — this page: the agent path (the driver), the human install path, the test command, gotchas, and troubleshooting.
|
|
82
|
+
- `driver.mjs` — the smoke harness that drives `bin/install.mjs` against a sandbox home directory. Run it; you do not need to read it. It sits beside this file at `.claude/skills/run-claude-dev-env/driver.mjs`.
|
|
83
|
+
|
|
84
|
+
The `/run` skill auto-discovers this skill when asked to run, install, or test `claude-dev-env`.
|
|
@@ -0,0 +1,239 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Smoke driver for the claude-dev-env installer.
|
|
4
|
+
*
|
|
5
|
+
* The installer (bin/install.mjs) writes into os.homedir()/.claude and
|
|
6
|
+
* os.homedir()/.agents and has
|
|
7
|
+
* three global side effects: it copies files under ~/.claude/ and ~/.agents/, sets
|
|
8
|
+
* `git config --global core.hooksPath`, and writes ~/.mypy.ini. There is no
|
|
9
|
+
* flag to redirect the target, so this driver isolates every side effect by
|
|
10
|
+
* spawning the installer with HOME, USERPROFILE, and GIT_CONFIG_GLOBAL all
|
|
11
|
+
* pointed at a throwaway sandbox directory. Node's os.homedir() follows
|
|
12
|
+
* USERPROFILE on Windows and HOME on POSIX, so setting both redirects the
|
|
13
|
+
* install target on either platform without touching the real ~/.claude/.
|
|
14
|
+
*
|
|
15
|
+
* The isolated GIT_CONFIG_GLOBAL is seeded with `safe.directory = *` so the
|
|
16
|
+
* installer's `git status` source-conflict guard runs even when the checkout
|
|
17
|
+
* lives somewhere git flags as dubious ownership (for example a UNC network
|
|
18
|
+
* share), while the installer's `git config --global core.hooksPath` write
|
|
19
|
+
* still lands only in the sandbox config.
|
|
20
|
+
*
|
|
21
|
+
* It runs the three lifecycle commands an agent cares about — `--help`, a full
|
|
22
|
+
* install, and `--uninstall` — and asserts the observable result of each
|
|
23
|
+
* against the sandbox tree. Exit code 0 means every assertion held.
|
|
24
|
+
*
|
|
25
|
+
* Usage: node .claude/skills/run-claude-dev-env/driver.mjs
|
|
26
|
+
*/
|
|
27
|
+
|
|
28
|
+
import { spawnSync } from 'node:child_process';
|
|
29
|
+
import {
|
|
30
|
+
mkdtempSync,
|
|
31
|
+
existsSync,
|
|
32
|
+
lstatSync,
|
|
33
|
+
readFileSync,
|
|
34
|
+
realpathSync,
|
|
35
|
+
writeFileSync,
|
|
36
|
+
readdirSync,
|
|
37
|
+
rmSync,
|
|
38
|
+
} from 'node:fs';
|
|
39
|
+
import { join, resolve, dirname } from 'node:path';
|
|
40
|
+
import { tmpdir } from 'node:os';
|
|
41
|
+
import { fileURLToPath } from 'node:url';
|
|
42
|
+
|
|
43
|
+
const DRIVER_DIRECTORY = dirname(fileURLToPath(import.meta.url));
|
|
44
|
+
const PACKAGE_ROOT = resolve(DRIVER_DIRECTORY, '..', '..', '..');
|
|
45
|
+
const INSTALL_ENTRY = join(PACKAGE_ROOT, 'bin', 'install.mjs');
|
|
46
|
+
|
|
47
|
+
const checks = [];
|
|
48
|
+
|
|
49
|
+
function record(label, passed, detail) {
|
|
50
|
+
checks.push({ label, passed, detail });
|
|
51
|
+
const mark = passed ? 'PASS' : 'FAIL';
|
|
52
|
+
console.log(` [${mark}] ${label}${detail ? ` — ${detail}` : ''}`);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
function collectFilesRecursive(directory) {
|
|
56
|
+
const collected = [];
|
|
57
|
+
if (!existsSync(directory)) return collected;
|
|
58
|
+
for (const entry of readdirSync(directory, { withFileTypes: true })) {
|
|
59
|
+
const entryPath = join(directory, entry.name);
|
|
60
|
+
if (entry.isDirectory()) {
|
|
61
|
+
collected.push(...collectFilesRecursive(entryPath));
|
|
62
|
+
} else {
|
|
63
|
+
collected.push(entryPath);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
return collected;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
function runInstaller(sandboxHome, installerArguments) {
|
|
70
|
+
const gitConfigGlobal = join(sandboxHome, '.gitconfig-sandbox');
|
|
71
|
+
const result = spawnSync(process.execPath, [INSTALL_ENTRY, ...installerArguments], {
|
|
72
|
+
cwd: PACKAGE_ROOT,
|
|
73
|
+
encoding: 'utf8',
|
|
74
|
+
env: {
|
|
75
|
+
...process.env,
|
|
76
|
+
HOME: sandboxHome,
|
|
77
|
+
USERPROFILE: sandboxHome,
|
|
78
|
+
GIT_CONFIG_GLOBAL: gitConfigGlobal,
|
|
79
|
+
},
|
|
80
|
+
});
|
|
81
|
+
return result;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
function main() {
|
|
85
|
+
const sandboxHome = mkdtempSync(join(tmpdir(), 'cde-driver-'));
|
|
86
|
+
const claudeHome = join(sandboxHome, '.claude');
|
|
87
|
+
writeFileSync(join(sandboxHome, '.gitconfig-sandbox'), '[safe]\n\tdirectory = *\n');
|
|
88
|
+
console.log(`Sandbox HOME: ${sandboxHome}`);
|
|
89
|
+
console.log(`Install entry: ${INSTALL_ENTRY}\n`);
|
|
90
|
+
|
|
91
|
+
try {
|
|
92
|
+
console.log('Step 1: node bin/install.mjs --help');
|
|
93
|
+
const help = runInstaller(sandboxHome, ['--help']);
|
|
94
|
+
record('--help exits 0', help.status === 0, `exit=${help.status}`);
|
|
95
|
+
record('--help prints usage', /Usage:/.test(help.stdout), '');
|
|
96
|
+
record('--help wrote nothing to ~/.claude', !existsSync(claudeHome), '');
|
|
97
|
+
|
|
98
|
+
console.log('\nStep 2: node bin/install.mjs (full install)');
|
|
99
|
+
const install = runInstaller(sandboxHome, []);
|
|
100
|
+
if (install.status !== 0) {
|
|
101
|
+
console.log(install.stdout);
|
|
102
|
+
console.log(install.stderr);
|
|
103
|
+
}
|
|
104
|
+
record('install exits 0', install.status === 0, `exit=${install.status}`);
|
|
105
|
+
|
|
106
|
+
const manifestPath = join(claudeHome, '.claude-dev-env-manifest.json');
|
|
107
|
+
let manifest = null;
|
|
108
|
+
if (existsSync(manifestPath)) {
|
|
109
|
+
manifest = JSON.parse(readFileSync(manifestPath, 'utf8'));
|
|
110
|
+
}
|
|
111
|
+
record('manifest written', manifest !== null, manifestPath);
|
|
112
|
+
record(
|
|
113
|
+
'manifest names this package',
|
|
114
|
+
manifest?.package === 'claude-dev-env',
|
|
115
|
+
manifest ? `package=${manifest.package} version=${manifest.version}` : 'missing',
|
|
116
|
+
);
|
|
117
|
+
record(
|
|
118
|
+
'manifest tracks installed files',
|
|
119
|
+
Array.isArray(manifest?.files) && manifest.files.length > 0,
|
|
120
|
+
manifest?.files ? `${manifest.files.length} files` : 'none',
|
|
121
|
+
);
|
|
122
|
+
|
|
123
|
+
const skillsDirectory = join(claudeHome, 'skills');
|
|
124
|
+
const agentsHomeSkillsDirectory = join(sandboxHome, '.agents', 'skills');
|
|
125
|
+
const installedSkills = existsSync(skillsDirectory)
|
|
126
|
+
? readdirSync(skillsDirectory, { withFileTypes: true }).filter((entry) => entry.isDirectory())
|
|
127
|
+
: [];
|
|
128
|
+
record('skills installed', installedSkills.length > 0, `${installedSkills.length} skill dirs`);
|
|
129
|
+
record(
|
|
130
|
+
'skills live under ~/.agents/skills',
|
|
131
|
+
existsSync(agentsHomeSkillsDirectory)
|
|
132
|
+
&& installedSkills.some((entry) => existsSync(join(agentsHomeSkillsDirectory, entry.name))),
|
|
133
|
+
agentsHomeSkillsDirectory,
|
|
134
|
+
);
|
|
135
|
+
record(
|
|
136
|
+
'~/.claude/skills is a directory pointer',
|
|
137
|
+
existsSync(skillsDirectory) && lstatSync(skillsDirectory).isSymbolicLink(),
|
|
138
|
+
skillsDirectory,
|
|
139
|
+
);
|
|
140
|
+
const sampleSkillName = installedSkills.find((entry) => existsSync(join(skillsDirectory, entry.name, 'SKILL.md')))?.name;
|
|
141
|
+
if (sampleSkillName) {
|
|
142
|
+
const lookupSkillPath = join(skillsDirectory, sampleSkillName, 'SKILL.md');
|
|
143
|
+
const canonicalSkillPath = join(agentsHomeSkillsDirectory, sampleSkillName, 'SKILL.md');
|
|
144
|
+
record(
|
|
145
|
+
'skill files match through the lookup pointer',
|
|
146
|
+
existsSync(lookupSkillPath)
|
|
147
|
+
&& existsSync(canonicalSkillPath)
|
|
148
|
+
&& realpathSync(lookupSkillPath) === realpathSync(canonicalSkillPath),
|
|
149
|
+
sampleSkillName,
|
|
150
|
+
);
|
|
151
|
+
} else {
|
|
152
|
+
record('skill files match through the lookup pointer', false, 'no skill dirs');
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
const agentsLookupDirectory = join(claudeHome, 'agents');
|
|
156
|
+
const agentsHomeAgentsDirectory = join(sandboxHome, '.agents', 'agents');
|
|
157
|
+
record(
|
|
158
|
+
'agents live under ~/.agents/agents',
|
|
159
|
+
existsSync(agentsHomeAgentsDirectory)
|
|
160
|
+
&& readdirSync(agentsHomeAgentsDirectory).some((name) => name.endsWith('.md')),
|
|
161
|
+
agentsHomeAgentsDirectory,
|
|
162
|
+
);
|
|
163
|
+
record(
|
|
164
|
+
'~/.claude/agents is a directory pointer',
|
|
165
|
+
existsSync(agentsLookupDirectory) && lstatSync(agentsLookupDirectory).isSymbolicLink(),
|
|
166
|
+
agentsLookupDirectory,
|
|
167
|
+
);
|
|
168
|
+
|
|
169
|
+
const hookFiles = collectFilesRecursive(join(claudeHome, 'hooks')).filter((file) =>
|
|
170
|
+
file.endsWith('.py'),
|
|
171
|
+
);
|
|
172
|
+
record('hook scripts installed', hookFiles.length > 0, `${hookFiles.length} .py files`);
|
|
173
|
+
|
|
174
|
+
const ruleFiles = existsSync(join(claudeHome, 'rules'))
|
|
175
|
+
? readdirSync(join(claudeHome, 'rules')).filter((name) => name.endsWith('.md'))
|
|
176
|
+
: [];
|
|
177
|
+
record('rules installed', ruleFiles.length > 0, `${ruleFiles.length} .md files`);
|
|
178
|
+
|
|
179
|
+
record('CLAUDE.md hub installed', existsSync(join(claudeHome, 'CLAUDE.md')), '');
|
|
180
|
+
|
|
181
|
+
const settingsPath = join(claudeHome, 'settings.json');
|
|
182
|
+
let managedHookCount = 0;
|
|
183
|
+
if (existsSync(settingsPath)) {
|
|
184
|
+
const settings = JSON.parse(readFileSync(settingsPath, 'utf8'));
|
|
185
|
+
for (const matcherGroups of Object.values(settings.hooks ?? {})) {
|
|
186
|
+
for (const group of matcherGroups) {
|
|
187
|
+
for (const hook of group.hooks ?? []) {
|
|
188
|
+
if (hook.command.replace(/\\/g, '/').includes('/.claude/hooks')) {
|
|
189
|
+
managedHookCount += 1;
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
record('settings.json carries managed hooks', managedHookCount > 0, `${managedHookCount} hook commands`);
|
|
196
|
+
|
|
197
|
+
const gitConfigGlobalPath = join(sandboxHome, '.gitconfig-sandbox');
|
|
198
|
+
const gitHooksPathRedirectedIntoSandbox =
|
|
199
|
+
existsSync(gitConfigGlobalPath) &&
|
|
200
|
+
readFileSync(gitConfigGlobalPath, 'utf8').replace(/\\/g, '/').includes('/.claude/hooks/git-hooks');
|
|
201
|
+
record(
|
|
202
|
+
'global git hooksPath isolated to sandbox',
|
|
203
|
+
gitHooksPathRedirectedIntoSandbox,
|
|
204
|
+
'GIT_CONFIG_GLOBAL kept the real ~/.gitconfig untouched',
|
|
205
|
+
);
|
|
206
|
+
|
|
207
|
+
const sampleInstalledFile = manifest?.files?.find((file) => existsSync(file));
|
|
208
|
+
|
|
209
|
+
console.log('\nStep 3: node bin/install.mjs --uninstall');
|
|
210
|
+
const uninstall = runInstaller(sandboxHome, ['--uninstall']);
|
|
211
|
+
if (uninstall.status !== 0) {
|
|
212
|
+
console.log(uninstall.stdout);
|
|
213
|
+
console.log(uninstall.stderr);
|
|
214
|
+
}
|
|
215
|
+
record('uninstall exits 0', uninstall.status === 0, `exit=${uninstall.status}`);
|
|
216
|
+
record('manifest removed', !existsSync(manifestPath), '');
|
|
217
|
+
record(
|
|
218
|
+
'tracked file removed',
|
|
219
|
+
sampleInstalledFile ? !existsSync(sampleInstalledFile) : false,
|
|
220
|
+
sampleInstalledFile ? sampleInstalledFile : 'no sample file captured',
|
|
221
|
+
);
|
|
222
|
+
} finally {
|
|
223
|
+
rmSync(sandboxHome, { recursive: true, force: true });
|
|
224
|
+
console.log(`\nSandbox removed: ${sandboxHome}`);
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
const failures = checks.filter((check) => !check.passed);
|
|
228
|
+
console.log(`\n${checks.length - failures.length}/${checks.length} checks passed.`);
|
|
229
|
+
if (failures.length > 0) {
|
|
230
|
+
console.log('FAILED:');
|
|
231
|
+
for (const failure of failures) {
|
|
232
|
+
console.log(` - ${failure.label}`);
|
|
233
|
+
}
|
|
234
|
+
process.exit(1);
|
|
235
|
+
}
|
|
236
|
+
console.log('ALL CHECKS PASSED');
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
main();
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
@../AGENTS.md
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
@../AGENTS.md
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
@../AGENTS.md
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
@../AGENTS.md
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Deterministic skill elements
|
|
2
2
|
|
|
3
|
-
Source: [Anthropic — Skill authoring best practices](https://platform.claude.com/docs/en/agents-and-tools/agent-skills/best-practices) (scripts, progressive disclosure), [Lessons from Building Claude Code](thariq-x-post-skills.json), repo skill conventions (`skills/CLAUDE.md`), `docs/CODE_RULES.md`, host task tools (`TaskCreate`, `TodoWrite`, and equivalents).
|
|
3
|
+
Source: [Anthropic — Skill authoring best practices](https://platform.claude.com/docs/en/agents-and-tools/agent-skills/best-practices) (scripts, progressive disclosure), [Lessons from Building Claude Code](thariq-x-post-skills.json), repo skill conventions (`skills/.claude/CLAUDE.md`), `docs/CODE_RULES.md`, host task tools (`TaskCreate`, `TodoWrite`, and equivalents).
|
|
4
4
|
|
|
5
5
|
## Contents
|
|
6
6
|
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
@../AGENTS.md
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
@../AGENTS.md
|
|
@@ -12,4 +12,4 @@ Each slice carries `id`, `title` (exactly one conventional prefix), `layer`
|
|
|
12
12
|
(one of `config` / `backend` / `frontend` / `tests` / `docs` / `other`), and
|
|
13
13
|
`all_paths`. Every path in `all_changed_paths` is assigned to exactly one
|
|
14
14
|
slice. Titles are normalized with `split_pr_title.normalize_split_title`.
|
|
15
|
-
Layer tokens follow `ALL_LAYER_ORDER` in `packages/claude-dev-env/skills/split-pr/scripts/config/plan_constants.py`.
|
|
15
|
+
Layer tokens follow `ALL_LAYER_ORDER` in `packages/claude-dev-env/.agents/skills/split-pr/scripts/config/plan_constants.py`.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
@../AGENTS.md
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
@../AGENTS.md
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
@../AGENTS.md
|
|
@@ -19,7 +19,7 @@ Flag on: run the Codex preflight first —
|
|
|
19
19
|
python ~/.claude/skills/codex-review/scripts/codex_usage_probe.py
|
|
20
20
|
```
|
|
21
21
|
|
|
22
|
-
Repo home: `packages/claude-dev-env/skills/codex-review/scripts/`.
|
|
22
|
+
Repo home: `packages/claude-dev-env/.agents/skills/codex-review/scripts/`.
|
|
23
23
|
|
|
24
24
|
The shared entry point is `~/.claude/_shared/advisor/scripts/codex_sol_advisor.py`; it calls the installed probe and owns Sol bind or resume parsing. Bind with `python ~/.claude/_shared/advisor/scripts/codex_sol_advisor.py --bind --cwd <repo-root>` and pipe the charter on stdin. Resume with `--resume <session_id>` and pipe the delta consult on stdin.
|
|
25
25
|
|
|
@@ -475,7 +475,7 @@ def test_bind_runs_probe_then_codex_with_read_only_xhigh_settings() -> None:
|
|
|
475
475
|
|
|
476
476
|
|
|
477
477
|
def test_team_advisor_path_preserves_sol_routing_fields() -> None:
|
|
478
|
-
team_advisor_path = SCRIPTS_ROOT.parents[2] / "skills" / "team-advisor" / "SKILL.md"
|
|
478
|
+
team_advisor_path = SCRIPTS_ROOT.parents[2] / ".agents" / "skills" / "team-advisor" / "SKILL.md"
|
|
479
479
|
sol_rung_path = SCRIPTS_ROOT.parent / "reference" / "sol-rung.md"
|
|
480
480
|
assert "advisor-protocol.md" in team_advisor_path.read_text(encoding="utf-8")
|
|
481
481
|
sol_rung = sol_rung_path.read_text(encoding="utf-8")
|
|
@@ -30,8 +30,12 @@ from collections.abc import Mapping
|
|
|
30
30
|
from pathlib import Path
|
|
31
31
|
|
|
32
32
|
_config_directory = str(Path(__file__).resolve().parent / "config")
|
|
33
|
-
|
|
34
|
-
|
|
33
|
+
sys.path[:] = [
|
|
34
|
+
each_existing_entry
|
|
35
|
+
for each_existing_entry in sys.path
|
|
36
|
+
if each_existing_entry != _config_directory
|
|
37
|
+
]
|
|
38
|
+
sys.path[:0] = [_config_directory]
|
|
35
39
|
|
|
36
40
|
from advisor_scripts_constants.model_tier_run_validator_constants import ( # noqa: E402
|
|
37
41
|
ALL_CLI_MODEL_ID_BY_TIER,
|
|
@@ -9,7 +9,7 @@ Canonical: `~/.claude/_shared/pr-loop/scripts/code_rules_gate.py` after install.
|
|
|
9
9
|
Workflows reference it via:
|
|
10
10
|
- all skills (bugteam, pr-converge): `${CLAUDE_SKILL_DIR}/../../_shared/pr-loop/scripts/code_rules_gate.py`
|
|
11
11
|
|
|
12
|
-
Cross-skill path traversal works because every skill installs as a flat top-level dir under `~/.claude/skills/` and `_shared/` lives alongside `skills/` under `~/.claude/`.
|
|
12
|
+
Cross-skill path traversal works because every skill installs as a flat top-level dir under the skills lookup path (`~/.claude/skills/`, a directory pointer to `~/.agents/skills/`) and `_shared/` lives alongside `skills/` under `~/.claude/`.
|
|
13
13
|
|
|
14
14
|
## Invocation
|
|
15
15
|
|
package/bin/AGENTS.md
CHANGED
|
@@ -1,23 +1,28 @@
|
|
|
1
1
|
# bin
|
|
2
2
|
|
|
3
|
-
The installer and its companion modules. Running `npx claude-dev-env` (or `node bin/install.mjs`) copies package files into the managed root (`~/.claude/` by default; `CLAUDE_CONFIG_DIR` or `--target` selects another), merges hook entries into that root's `settings.json`, installs Git hooks, writes `~/.mypy.ini` under the process home, and copies Codex exec-policy files into `~/.codex/rules` (`CODEX_HOME/rules` when that variable is set), and generates Cursor `.mdc` files into `~/.cursor/rules` from the installed Claude rules.
|
|
3
|
+
The installer and its companion modules. Running `npx claude-dev-env` (or `node bin/install.mjs`) copies package files into the managed root (`~/.claude/` by default; `CLAUDE_CONFIG_DIR` or `--target` selects another), copies skills and agents into the agents home (`~/.agents/` for the default root) and publishes directory pointers at `skills/` and `agents/` under the managed root, merges hook entries into that root's `settings.json`, installs Git hooks, writes `~/.mypy.ini` under the process home, and copies Codex exec-policy files into `~/.codex/rules` (`CODEX_HOME/rules` when that variable is set), and generates Cursor `.mdc` files into `~/.cursor/rules` from the installed Claude rules.
|
|
4
4
|
|
|
5
5
|
## Files
|
|
6
6
|
|
|
7
7
|
| File | Purpose |
|
|
8
8
|
|---|---|
|
|
9
|
-
| `install.mjs` | Main installer: builds a read-only plan via `install-plan.mjs`, then runs mutations inside `install-transaction.mjs` recovery (copy content directories, merge hooks, install skills, prune, git hooks, mypy.ini); routes `CLAUDE_HOME`, the manifest path, and `~/.mypy.ini` through `resolve-install-root.mjs`; resolves single or multi-profile targets before mutation and writes one ownership manifest per target |
|
|
10
|
-
| `resolve-install-root.mjs` | Pure install-root resolver: precedence `--target` > `CLAUDE_CONFIG_DIR` > `~/.claude`, separator-boundary containment, and the declared external allowlist for `~/.mypy.ini` plus files under the Codex rules directory and the
|
|
9
|
+
| `install.mjs` | Main installer: builds a read-only plan via `install-plan.mjs`, then runs mutations inside `install-transaction.mjs` recovery (publish skill/agent lookup pointers, copy content directories, merge hooks, install skills, prune, git hooks, mypy.ini); routes `CLAUDE_HOME`, the agents home, the manifest path, and `~/.mypy.ini` through `resolve-install-root.mjs`; resolves single or multi-profile targets before mutation and writes one ownership manifest per target |
|
|
10
|
+
| `resolve-install-root.mjs` | Pure install-root resolver: precedence `--target` > `CLAUDE_CONFIG_DIR` > `~/.claude`, sibling `.agents` home (or `<root>.agents` for a named profile), separator-boundary containment, and the declared external allowlist for `~/.mypy.ini` plus files under the Codex rules directory, the Cursor home, and the agents home |
|
|
11
|
+
| `resolve-package-managed-directory.mjs` | Package-source resolver: skills and agents under `.agents/<name>/`, with a package-root `<name>/` fallback for dependency packages |
|
|
12
|
+
| `resolve-package-managed-directory.test.mjs` | Real-filesystem tests for the source resolver plus the live package `.agents` trees and `.claude` pointers |
|
|
13
|
+
| `publish-directory-pointer.mjs` | Directory-pointer helper: POSIX symlink or Windows junction from a Claude lookup path to the agents home; relocates a real directory at the lookup path into the target |
|
|
14
|
+
| `publish-directory-pointer.test.mjs` | Real-filesystem tests for pointer create, refresh, relocate, and unlink |
|
|
11
15
|
| `select-install-targets.mjs` | Pure target selection for main-default, explicit `--target`, and `--profile`/`--profiles`; rejects ambiguous or duplicate targets; builds per-target manifest records with `targetIdentity` and `managedRoot` |
|
|
12
16
|
| `install-plan.mjs` | Read-only install and uninstall plans: install preflight (managed root, source conflicts, Python, settings when hooks install) and uninstall preflight (settings JSON before removal, removable vs skipped manifest records), freezes plans E2/F execute |
|
|
13
17
|
| `install-transaction.mjs` | Install, update, and uninstall transaction journal: captures prior settings, manifest, managed files, and `core.hooksPath`, restores them on failure, and supports fault injection phases for recovery tests |
|
|
14
18
|
| `install.transaction.test.mjs` | Unit and sandbox installer tests for snapshot/restore and fault phases (`after_file_staging`, `after_settings_write`, `after_git_config`, `after_manifest_write`) |
|
|
15
19
|
| `install.uninstall-transaction.test.mjs` | Uninstall plan preflight and recovery: malformed/non-object settings fail before removal, each fault phase restores files/settings/manifest/`core.hooksPath`, retry succeeds, selected-root containment |
|
|
16
|
-
| `install.profile-root.test.mjs` | Contract tests for the install-root resolver: precedence, containment boundary, external allowlist, and the install.mjs import smoke check |
|
|
20
|
+
| `install.profile-root.test.mjs` | Contract tests for the install-root resolver: precedence, containment boundary, external allowlist, agents-home pairing, and the install.mjs import smoke check |
|
|
21
|
+
| `install.agents-home.test.mjs` | End-to-end tests that a sandbox install writes skills and agents under `.agents` and publishes `.claude/skills` and `.claude/agents` as directory pointers |
|
|
17
22
|
| `install.codex-rules.test.mjs` | Tests that Codex exec-policy files copy to `~/.codex/rules`, honor `CODEX_HOME`, skip `--only journal`, and uninstall without touching `default.rules` |
|
|
18
23
|
| `install.cursor-rules.test.mjs` | Tests that Cursor `.mdc` files generate into `~/.cursor/rules` from Claude rules, skip `--only journal`, and leave a local extra `.mdc` in place |
|
|
19
|
-
| `install-constants.mjs` | The named values `install.mjs` reads: `SKIPPED_SOURCE_ENTRY_NAMES` and `SKIPPED_SOURCE_FILE_EXTENSIONS` for the build artifacts the source walk leaves behind, `RUN_BACKUP_DIRECTORY_NAME_PATTERN` for the timestamp shape a run backup directory carries, `MANAGED_SKILLS_DIRECTORY_NAME` and `
|
|
20
|
-
| `ever-shipped-skills.mjs` | Static `EVER_SHIPPED_SKILL_NAMES` set of every top-level skill directory name the package has shipped; the installer subtracts the current skill set from it to prune retired skills left under `~/.
|
|
24
|
+
| `install-constants.mjs` | The named values `install.mjs` reads: `SKIPPED_SOURCE_ENTRY_NAMES` and `SKIPPED_SOURCE_FILE_EXTENSIONS` for the build artifacts the source walk leaves behind, `RUN_BACKUP_DIRECTORY_NAME_PATTERN` for the timestamp shape a run backup directory carries, `PACKAGE_AGENTS_HOME_DIRECTORY_NAME` for the `.agents` source home, `MANAGED_SKILLS_DIRECTORY_NAME` and `MANAGED_AGENTS_DIRECTORY_NAME` for the directory name each of those trees carries in a package source and under the agents home — read by the copy loops, the pointer publisher, and the prunes alike — `MANAGED_HOOKS_DIRECTORY_NAME` for the hooks tree under `~/.claude`, `SETTINGS_FILE_NAME` for the settings file the merge, the retired-hook prune, and the uninstall purge share, and `MYPY_INI_FILE_NAME` for the home-directory file `install_mypy_ini.mjs` writes, plus the Codex home and rules directory names `resolve-install-root.mjs` uses |
|
|
25
|
+
| `ever-shipped-skills.mjs` | Static `EVER_SHIPPED_SKILL_NAMES` set of every top-level skill directory name the package has shipped; the installer subtracts the current skill set from it to prune retired skills left under `~/.agents/skills` |
|
|
21
26
|
| `expand_home_directory_tokens.mjs` | Expands residual `$HOME` / `${HOME}` / `~/` tokens in settings.json hook and statusLine commands to absolute home paths at install time (literal-safe for homes that contain `$`) |
|
|
22
27
|
| `git_hooks_installer.mjs` | Installs or updates the `pre-commit`, `pre-push`, and `post-commit` Git hooks in the user's git config; writes hook scripts that delegate to the installed Python hooks |
|
|
23
28
|
| `install_mypy_ini.mjs` | Writes `~/.mypy.ini` with settings that make mypy find the hooks package and enforce strict type checking |
|
|
@@ -42,9 +47,9 @@ The decision reads the destination directory's entry names, cached one listing p
|
|
|
42
47
|
|
|
43
48
|
## Retired-skill prune
|
|
44
49
|
|
|
45
|
-
The full-install prune renames a retired skill directory into a timestamped backup rather than deleting it. Each pruned directory is renamed to `~/.claude/.claude-dev-env-pruned/<timestamp>/skills/<skill-name>/`, a backup root outside `~/.
|
|
50
|
+
The full-install prune renames a retired skill directory into a timestamped backup rather than deleting it. Each pruned directory is renamed to `~/.claude/.claude-dev-env-pruned/<timestamp>/skills/<skill-name>/`, a backup root outside `~/.agents/skills` so a backed-up directory is never re-discovered as a skill. The `skills/` segment matches the layout the stale-file prune writes, so one recovery point reads as a copy of the tree it came from. One run shares one timestamped root, so a run leaves one recovery point. A rename that fails leaves the directory in place with a logged warning and never falls back to deletion, so a prune failure costs at most a cosmetic leftover.
|
|
46
51
|
|
|
47
|
-
Matching is by directory name alone, so a user-authored directory whose name collides with a retired skill is backed up as if it were that skill. A directory is pruned when the prior install's manifest recorded it or the ever-shipped set names it, and the current install did not just write it. A name absent from all three of those sets, together with `~/.
|
|
52
|
+
Matching is by directory name alone, so a user-authored directory whose name collides with a retired skill is backed up as if it were that skill. A directory is pruned when the prior install's manifest recorded it or the ever-shipped set names it, and the current install did not just write it. A name absent from all three of those sets, together with `~/.agents/skills/_shared`, is left in place. Recovery of a wrongly-matched directory runs until the next pruning install, which keeps its own backup and retires the rest.
|
|
48
53
|
|
|
49
54
|
## Stale-file prune
|
|
50
55
|
|
|
@@ -52,7 +57,7 @@ A full install also moves aside a file under a managed root that the run leaves
|
|
|
52
57
|
|
|
53
58
|
Nothing moves unless a prior install recorded it. That single rule is what makes covering ten roots as safe as covering one: the installer reads the file list from `~/.claude/.claude-dev-env-manifest.json`, subtracts every file the run copied across all source roots, and moves what remains.
|
|
54
59
|
|
|
55
|
-
The prune runs once per root, each call confined to its own root. Per-root iteration gives the containment guard and the emptied-parent walk the root that owns each file, and it settles `_shared`: `~/.claude/_shared` and `~/.
|
|
60
|
+
The prune runs once per root, each call confined to its own root. Per-root iteration gives the containment guard and the emptied-parent walk the root that owns each file, and it settles `_shared`: `~/.claude/_shared` and `~/.agents/skills/_shared` are distinct absolute paths, so the `_shared` call and the `skills` call each see their own files and no path enters two diffs. Each root's content lands under `~/.claude/.claude-dev-env-pruned/<timestamp>/<root-name>/<relative>`. Every prune in a run shares that one timestamped root. A recorded path under no managed root — `~/.claude/CLAUDE.md`, `settings.json`, the manifest itself, and the `~/.mypy.ini` that sits in the home directory beside `~/.claude` — reaches no root's diff and stays where it is. The install summary reports the skills root's own count on the `skills:` line and the sum across roots on its own line.
|
|
56
61
|
|
|
57
62
|
The manifest diff limits the move to files the installer itself wrote. Runtime-generated content — a Python `__pycache__` entry, a ruff cache, a log — and any file a user authored under a managed root stay in place, because no install recorded them. Path comparison ignores letter case on Windows and macOS, so a package shipping `README.md` over an installed `Readme.md` keeps the bytes the run just wrote. A directory or a link standing where the manifest records a file is skipped with a warning, so the mover never renames a whole tree and never follows a link out of `~/.claude`. A directory emptied by a move is removed, walking up to the root the file sat under. A move that fails logs a warning and leaves the file in place, so a prune failure costs at most a stale file. The installer records each such path in the fresh manifest when the file is still on disk, so the file stays inside the next full install's diff and gets another attempt.
|
|
58
63
|
|
|
@@ -80,7 +85,7 @@ A run that moves nothing sweeps nothing, so every recovery point the user holds
|
|
|
80
85
|
|
|
81
86
|
`--uninstall` builds a read-only uninstall plan, captures a recovery snapshot, then removes each file the plan lists.
|
|
82
87
|
|
|
83
|
-
Settings JSON is validated before any removal. A malformed or non-object `settings.json` fails closed with the managed files still on disk. Each manifest record passes a containment guard: the path resolves under `~/.claude`, or it names the `~/.mypy.ini` the install writes in the home directory, or it sits under the Codex rules directory. Every other record is skipped with a warning and counted. Skipping keeps one malformed record — hand-edited, or written by an installer that ran against a different home — from stranding the user with a half-removed install. The purge removes every legitimate record, clears the manifest, and reports the skipped count.
|
|
88
|
+
Settings JSON is validated before any removal. A malformed or non-object `settings.json` fails closed with the managed files still on disk. Each manifest record passes a containment guard: the path resolves under `~/.claude`, or it names the `~/.mypy.ini` the install writes in the home directory, or it sits under the Codex rules directory, or it sits under the Cursor home, or it sits under the agents home. Every other record is skipped with a warning and counted. Skipping keeps one malformed record — hand-edited, or written by an installer that ran against a different home — from stranding the user with a half-removed install. The purge removes every legitimate record, clears the manifest, and reports the skipped count.
|
|
84
89
|
|
|
85
90
|
The uninstall runs inside the same snapshot/restore journal as install: prior settings, manifest, managed files, and `core.hooksPath` restore when a later phase fails, so a retry starts from a complete ownership record. The journal is discarded only after a successful commit.
|
|
86
91
|
|
|
@@ -94,8 +99,8 @@ Every prune runs behind the same two gates: a full install, and every declared d
|
|
|
94
99
|
|
|
95
100
|
| Export | Description |
|
|
96
101
|
|---|---|
|
|
97
|
-
| `CONTENT_DIRECTORIES` | Array of package subdirectory names copied verbatim to `~/.claude/` |
|
|
98
|
-
| `MANAGED_TOP_LEVEL_DIRECTORY_NAMES` | The content directories plus `skills` and `hooks`; the stale-file prune walks it to give each root its own diff, and the uninstall purge reads it to find the root a recorded file belongs to |
|
|
102
|
+
| `CONTENT_DIRECTORIES` | Array of package subdirectory names copied verbatim to `~/.claude/` (skills and agents are outside this list; they copy into the agents home) |
|
|
103
|
+
| `MANAGED_TOP_LEVEL_DIRECTORY_NAMES` | The content directories plus `skills`, `agents`, and `hooks`; the stale-file prune walks it to give each root its own diff, and the uninstall purge reads it to find the root a recorded file belongs to |
|
|
99
104
|
| `collectFiles(directory)` | Lists every file under a source directory, skipping the build-artifact names and extensions in `install-constants.mjs` |
|
|
100
105
|
| `pythonCandidatesForPlatform(platform)` | Returns ordered Python interpreter candidates to probe; `py -3` first on Windows to avoid Microsoft Store alias issues |
|
|
101
106
|
| `isWindowsStorePythonStub(path)` | Returns true when the path resolves to the non-spawnable WindowsApps stub |
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*
|
|
4
4
|
* The installer subtracts the skills the current package installs from this set
|
|
5
5
|
* to learn which shipped skills have retired, so a full reinstall can remove a
|
|
6
|
-
* retired skill left behind under ~/.
|
|
6
|
+
* retired skill left behind under ~/.agents/skills. Because the current set is
|
|
7
7
|
* subtracted at runtime, restoring a retired skill to the package protects it
|
|
8
8
|
* automatically — it re-enters the installed set and drops out of the retired
|
|
9
9
|
* set on the next install.
|
|
@@ -12,7 +12,9 @@
|
|
|
12
12
|
* installs from the npm tarball, which carries no source-repo history. Refresh
|
|
13
13
|
* it by running, from the repository root:
|
|
14
14
|
*
|
|
15
|
-
* git log --all --pretty=format: --name-only --
|
|
15
|
+
* git log --all --pretty=format: --name-only -- \
|
|
16
|
+
* 'packages/claude-dev-env/.agents/skills/*\/SKILL.md' \
|
|
17
|
+
* 'packages/claude-dev-env/skills/*\/SKILL.md' | sort -u
|
|
16
18
|
*
|
|
17
19
|
* and pasting each distinct top-level skill directory name below.
|
|
18
20
|
*/
|
|
@@ -64,6 +66,7 @@ export const EVER_SHIPPED_SKILL_NAMES = new Set([
|
|
|
64
66
|
'remember',
|
|
65
67
|
'research-mode',
|
|
66
68
|
'reviewer-gates',
|
|
69
|
+
'run-claude-dev-env',
|
|
67
70
|
'session-log',
|
|
68
71
|
'session-tidy',
|
|
69
72
|
'skill-builder',
|
|
@@ -44,18 +44,43 @@ export const SKIPPED_SOURCE_FILE_EXTENSIONS = new Set(['.pyc', '.pyo']);
|
|
|
44
44
|
export const RUN_BACKUP_DIRECTORY_NAME_PATTERN =
|
|
45
45
|
/^\d{4}-\d{2}-\d{2}T\d{2}-\d{2}-\d{2}-\d{3}Z$/;
|
|
46
46
|
|
|
47
|
+
/**
|
|
48
|
+
* Package subdirectory that holds the canonical skill and agent source trees.
|
|
49
|
+
*
|
|
50
|
+
* This package keeps those trees at `<package-root>/.agents/skills` and
|
|
51
|
+
* `<package-root>/.agents/agents`. `packages/claude-dev-env/.claude/skills` and
|
|
52
|
+
* `.claude/agents` are directory pointers to that home. A dependency package
|
|
53
|
+
* may still keep `skills/` and `agents/` at its package root; the source
|
|
54
|
+
* resolver tries this directory first and falls back to the package-root name.
|
|
55
|
+
*/
|
|
56
|
+
export const PACKAGE_AGENTS_HOME_DIRECTORY_NAME = '.agents';
|
|
57
|
+
|
|
47
58
|
/**
|
|
48
59
|
* The directory name skill directories carry in a package source and under
|
|
49
|
-
*
|
|
60
|
+
* the agents home.
|
|
50
61
|
*
|
|
51
|
-
* The copy loop reads `<package-root
|
|
52
|
-
* dependency
|
|
53
|
-
*
|
|
54
|
-
*
|
|
55
|
-
* the
|
|
62
|
+
* The copy loop reads `<package-root>/.agents/skills` (or `<package-root>/skills`
|
|
63
|
+
* when a dependency still ships that layout) and writes `~/.agents/skills`.
|
|
64
|
+
* Claude Code still looks up skills at `~/.claude/skills`, which the installer
|
|
65
|
+
* publishes as a directory pointer to that agents-home folder. The dependency
|
|
66
|
+
* walk reads the resolved skills source, the retired-skill prune reads the
|
|
67
|
+
* installed directory through the pointer, and the per-root stale-file prune
|
|
68
|
+
* names it as one of its roots. One spelling serves every one of them, so the
|
|
69
|
+
* copy destination and the prune target stay the same directory.
|
|
56
70
|
*/
|
|
57
71
|
export const MANAGED_SKILLS_DIRECTORY_NAME = 'skills';
|
|
58
72
|
|
|
73
|
+
/**
|
|
74
|
+
* The directory name agent definition files carry in a package source and under
|
|
75
|
+
* the agents home.
|
|
76
|
+
*
|
|
77
|
+
* The copy loop reads `<package-root>/.agents/agents` (or `<package-root>/agents`
|
|
78
|
+
* when a dependency still ships that layout) and writes `~/.agents/agents`.
|
|
79
|
+
* Claude Code still looks up agents at `~/.claude/agents`, which the installer
|
|
80
|
+
* publishes as a directory pointer to that agents-home folder.
|
|
81
|
+
*/
|
|
82
|
+
export const MANAGED_AGENTS_DIRECTORY_NAME = 'agents';
|
|
83
|
+
|
|
59
84
|
/**
|
|
60
85
|
* The directory name hook scripts carry in a package source and under
|
|
61
86
|
* `~/.claude`.
|
package/bin/install-plan.mjs
CHANGED
|
@@ -285,7 +285,12 @@ export function describeInstallMutations(plan) {
|
|
|
285
285
|
if (plan.shouldPurgeBeforeReinstall) {
|
|
286
286
|
allMutations.push('purge_managed_installation');
|
|
287
287
|
}
|
|
288
|
-
allMutations.push(
|
|
288
|
+
allMutations.push(
|
|
289
|
+
'ensure_managed_root',
|
|
290
|
+
'publish_directory_pointers',
|
|
291
|
+
'copy_content_trees',
|
|
292
|
+
'copy_skills',
|
|
293
|
+
);
|
|
289
294
|
if (plan.shouldInstallHooks) {
|
|
290
295
|
allMutations.push(
|
|
291
296
|
'copy_hook_files',
|